UIViewController

本博客详细介绍了UIViewController在iOS应用开发中的角色与使用方法,包括其继承关系、生命周期及如何实现画面切换。通过实例代码展示如何创建并管理不同外观的画面,优化代码结构。

UIViewController


UIViewController的继承关系



        UIViewController是继承于UIResponder(UIResponder 这个类定义了很多用来处理响应和时间处理的类)。UIViewController在UIKit中主要功能是用于控制画面的切换,其中的view属性(UIView类型)管理整个画面的外观。

iPhone App开发时UIViewController不是必不可少,下面的程序直接加载在AppDelegate.m文件的window上。

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Override point for customization after application launch.

    // 设置背景颜色

    self.window.backgroundColor = [UIColor colorWithRed:200.0 green:0.0 blue:200.0 alpha:1.0];

    // window设置为app的主window并且可见

    [self.window makeKeyAndVisible];

    // 内存管理

    [_window release];

    // UIView  代表屏幕上的一块矩形区域

    //所有空间类的基类

    //规定了所有控件的基本行为和属性

    UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 375, 300)];

    view.backgroundColor = [UIColor purpleColor];

    // view加到 windiw

    [self.window addSubview:view];

    [view release];

但是,像上述这样实现画面外观的切换,如果同一个画面中实际上包含多个画面的控件,代码看起来将非常凌乱。如果能将不同外观的画面进行整体的切换显然更合理,UIViewController正是用于实现这种画面切换方式的。

UIViewController的创建

UIViewController使用时需要先创建一个子类,并在AppDelegate.m中声明rootViewController为UIViewController子类的对象

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Override point for customization after application launch.

    self.window.backgroundColor = [UIColor whiteColor];

    [self.window makeKeyAndVisible];

    

    // UIViewController

    // 1.UIViewController的一个对象代表一个页面,负责处理一部分功能(登录页面,注册页面,找回密码页面......是不同的viewController)

    // 2. UIviewController是一个抽象类,不能直接使用如果要使用需要创建它的子类才能使用

    RootViewController *rootVC = [[RootViewController alloc]init];

    //window设置一个根视图控制器,作为启动之后的默认显示的界面

    self.window.rootViewController = rootVC;

    [rootVC release];

    [_window release];

    return YES;

}

UIViewController的生命周期

1.初始化方法:init,initWithCoder;

2.加载controller's view:loadView: controller.view=nil; viewDidLoad: controller.view=view;

3.当收到didREceiveMemoryWarning的时候会调用viewWillUnload,viewDidUnload;

4.dealloc:释放资源(ARC可以忽略)




### GIDSignIn 使用指南及 UIViewController 类型相关问题解决 在使用 `GIDSignIn.sharedInstance.signInWithPresentingViewController:self completion:` 方法时,如果出现与 `self` 或 `UIViewController` 类型相关的报错,可能是以下原因导致的。以下是详细的解决方案和使用指南。 #### 1. 确保 `self` 是 `UIViewController` 的实例 该方法要求传入的参数是一个符合 `UIViewController` 类型的对象。如果 `self` 不是 `UIViewController` 或其子类,则会导致编译错误或运行时崩溃。可以通过以下方式验证 `self` 是否为 `UIViewController` 的实例: ```objc if ([self isKindOfClass:[UIViewController class]]) { [GIDSignIn.sharedInstance signInWithPresentingViewController:self completion:^(GIDSignInResult * _Nullable result, NSError * _Nullable error) { if (error == nil && result != nil) { NSLog(@"登录成功"); } else { NSLog(@"登录失败:%@", error.localizedDescription); } }]; } else { NSLog(@"self 必须是 UIViewController 的实例"); } ``` 此代码片段确保了调用方是一个有效的视图控制器[^1]。 #### 2. 设置正确的代理 在调用 `signInWithPresentingViewController:completion:` 方法前,必须确保 `GIDSignIn.sharedInstance.delegate` 已被正确设置为当前视图控制器。例如: ```objc GIDSignIn.sharedInstance.delegate = self; ``` 如果没有正确设置代理,可能导致登录界面无法正常显示或回调失败[^2]。 #### 3. 配置 Info.plist 文件 确保在项目的 `Info.plist` 文件中添加了必要的键值对,包括但不限于: - `CFBundleURLTypes`: 定义应用的 URL Scheme。 - `GoogleSignInClientID`: 设置 Google Sign-In 的客户端 ID。 如果缺少这些配置,可能导致登录失败或回调异常[^3]。 #### 4. 更新 Google Sign-In SDK 如果使用的 Google Sign-In SDK 版本较旧,可能导致方法签名不匹配或功能异常。建议通过 CocoaPods 更新到最新版本: ```bash pod 'GoogleSignIn' pod install ``` 更新后,确保代码中的方法签名与最新版本的 SDK 保持一致[^4]。 #### 5. 处理 iOS 13 及更高版本的兼容性问题 对于 iOS 13 及更高版本,需要在 `SceneDelegate` 中初始化窗口和根视图控制器,否则可能导致登录界面无法正常显示。例如: ```objc self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene*)scene]; self.window.rootViewController = [[UIViewController alloc] init]; [self.window makeKeyAndVisible]; ``` #### 6. 错误处理 如果登录过程中出现错误,可以通过 `NSError` 对象的 `localizedDescription` 属性获取详细信息。常见的错误包括但不限于: - 用户取消登录。 - 网络连接问题。 - 配置错误(如未正确设置客户端 ID)。 以下是一个完整的实现示例: ```objc [GIDSignIn.sharedInstance signInWithPresentingViewController:self completion:^(GIDSignInResult * _Nullable result, NSError * _Nullable error) { if (error == nil && result != nil) { GIDGoogleUser *user = result.user; NSString *googleIdToken = user.idToken; NSString *googleAccessToken = user.accessToken; NSLog(@"Google ID Token: %@", googleIdToken); NSLog(@"Google Access Token: %@", googleAccessToken); } else { NSLog(@"Google 登录失败:%@", error.localizedDescription); } }]; ``` #### 7. UIViewController 类型的相关用法 `UIViewController` 是 iOS 开发中用于管理用户界面的核心类。以下是一些常见用法: - **初始化视图控制器**:可以通过 `init` 或 `initWithNibName:bundle:` 方法创建视图控制器实例。 - **加载视图**:当视图控制器的视图首次被访问时,会自动调用 `loadView` 和 `viewDidLoad` 方法。 - **生命周期方法**:常用的生命周期方法包括 `viewWillAppear:`、`viewDidAppear:`、`viewWillDisappear:` 和 `viewDidDisappear:`。 - **导航**:可以通过 `UINavigationController` 实现视图控制器的推送和弹出操作。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值