【问题标题】:iPhone go from View to TableViewiPhone 从 View 转到 TableView
【发布时间】:2011-01-20 16:42:27
【问题描述】:

我有一个登录视图,在检查用户名后我想进入一个表格视图。 我从苹果示例代码下载了 SimpleDrillDown 应用程序,我希望在运行应用程序时首先查看登录页面,然后查看 TableView。

如果有人有时间可以在这里找到该项目: http://developer.apple.com/iphone/library/samplecode/SimpleDrillDown/index.html

我所做的更改是:

SimpleDrillDownAppDelegate.m

导入“SimpleDrillDownAppDelegate.h” 导入“RootViewController.h” 导入“LoginViewController.h” 导入“DataController.h” @implementation SimpleDrillDownAppDelegate @synthesize 窗口; @synthesize 导航控制器; @synthesize 根视图控制器; @synthesize 登录视图控制器; @synthesize 数据控制器; - (void)applicationDidFinishLaunching:(UIApplication *)application { //托马斯添加这个 LoginViewController *_loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:[NSBundle mainBundle]]; self.loginViewController = _loginViewController; // [_loginViewController 发布]; // //托马斯添加这个 // 创建数据控制器。 //DataController *controller = [[DataController alloc] init]; // self.dataController = 控制器; // [控制器释放]; //rootViewController.dataController = dataController; /* 导航和根视图控制器在主 nib 文件中创建。 使用导航控制器的视图配置窗口,然后显示它。 */ //thomas 对此进行了评论并将其复制到 LoginView //[窗口 addSubview:[navigationController 视图]]; //托马斯添加这个 [窗口添加子视图:[loginViewController 视图]]; //托马斯添加这个 [窗口 makeKeyAndVisible]; } - (无效)dealloc { //[navigationController 发布]; //[rootViewController 发布]; [loginViewController 发布]; [窗口释放]; //[数据控制器发布]; [超级释放]; } @结尾

SimpleDrillDownAppDelegate.h

@class 数据控制器; @class RootViewController; @class 登录视图控制器; @interface SimpleDrillDownAppDelegate : NSObject { UIWindow *窗口; UINavigationController *navigationController; 根视图控制器 *根视图控制器; 登录视图控制器 *登录视图控制器; 数据控制器 *数据控制器; } @property (nonatomic, 保留) IBOutlet UIWindow *window; @property (nonatomic, 保留) IBOutlet UINavigationController *navigationController; @property(非原子,保留)IBOutlet RootViewController *rootViewController; @property (nonatomic, 保留) IBOutlet LoginViewController *loginViewController; @property (nonatomic, 保留) DataController *dataController; @结尾

LoginViewController.h

#进口 @class 数据控制器; @class RootViewController; @class 登录视图控制器; @interface 登录视图控制器:UIViewController { 数据控制器 *数据控制器; IBOutlet UITextField *usernameField; IBOutlet UITextField *passwordField; IBOutlet UIButton *loginButton; IBOutlet UIActivityIndi​​catorView *loginIndicator; UINavigationController *navigationController; 根视图控制器 *根视图控制器; } @property (nonatomic, 保留) UITextField *usernameField; @property (nonatomic, 保留) UITextField *passwordField; @property (nonatomic, 保留) UIButton *loginButton; @property (nonatomic, 保留) UIActivityIndi​​catorView *loginIndicator; @property (nonatomic, 保留) IBOutlet UINavigationController *navigationController; @property (nonatomic, 保留) DataController *dataController; @property(非原子,保留)IBOutlet RootViewController *rootViewController; -(IBAction)登录:(id)发件人; @结尾

LoginViewController.m

#import "LoginViewController.h" #import "数据控制器.h" #import "RootViewController.h" @implementation 登录视图控制器 @synthesize 用户名字段; @synthesize 密码字段; @synthesize 登录按钮; @synthesize 登录指示符; @synthesize 导航控制器; @synthesize 数据控制器; @synthesize 根视图控制器; /* // 指定的初始化器。如果您以编程方式创建控制器并希望执行不适合 viewDidLoad 的自定义,请覆盖。 - (id)initWithNibName:(NSString *)nibNameOrNil 包:(NSBundle *)nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { // 自定义初始化 } 回归自我; } */ /* // 实现 loadView 以编程方式创建视图层次结构,无需使用 nib。 -(无效)加载视图{ } */ /* // 实现 viewDidLoad 以在加载视图后进行额外的设置,通常来自 nib。 - (void)viewDidLoad { [超级视图DidLoad]; } */ /* // 覆盖以允许默认纵向以外的方向。 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // 对于支持的方向返回 YES return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // 如果没有超级视图,则释放视图。 [super didReceiveMemoryWarning]; // 释放所有未使用的缓存数据、图像等。 } - (void)viewDidUnload { // 释放主视图的所有保留子视图。 // 例如self.myOutlet = nil; } - (无效)dealloc { [超级释放]; } - (IBAction)登录:(id)发件人 { // TODO: 产生一个登录线程 NSString *userName = usernameField.text; NSString *pass = passwordField.text; loginIndicator.hidden = FALSE; [loginIndicator 开始动画]; loginButton.enabled = FALSE; //在此处硬编码凭据 if ([userName isEqualToString: @"test"] && [pass isEqualToString: @"test"]){ // 创建数据控制器。 DataController *controller = [[DataController alloc] init]; self.dataController = 控制器; [控制器释放]; rootViewController.dataController = 数据控制器; [self pushViewController:self.navigationController动画:YES]; }别的{ printf("错误"); } } @结尾

我终于得到了这个错误

错误日志

2010-02-24 21:19:55.595 SimpleDrillDown [97651:207] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“***-[LoginViewController pushViewController:animated:]:无法识别的选择器发送到实例 0x190d8a0 ' 2010-02-24 21:19:55.595 SimpleDrillDown[97651:207] 堆栈:( 807902715, 2501092617, 808284155, 807854166, 807706786, 18813, 814709201, 815110321, 815119058, 815114808, 814812979, 814722763, 814748641, 839148405, 807687520, 807683624, 839142449, 839142646, 814752238, 9140, 8994 )

抱歉,这篇文章很长,但我不知道在哪里可以搜索我在这里读到了一篇文章的语气:(

提前谢谢大家

【问题讨论】:

    标签: iphone uitableview


    【解决方案1】:

    在您的登录 IBAction 中,向 LoginViewController 发送 pushViewController: animated: 消息。该消息及其对应部分 popViewControllerAnimated: 在 UINavigationController 类中可用。

    很遗憾,您的 LoginViewController 不是 UINavigationController。

    您可以通过将其更改为来修复该特定错误:

    [self.navigationController pushViewController:self.dataController animated:YES];
    

    假设 LoginViewController 由 UINavigationController 托管。

    【讨论】:

    • 感谢您的时间和回答,我刚刚尝试了这个但没有任何反应,我只能看到指示器加载但没有重定向到下一页。你认为登录页面必须是 UINavigationController?
    • 我发现这可能很有帮助,但我不知道如何更改我的代码才能使用它,我试过但我收到错误starterstep.wordpress.com/2009/03/05/…
    【解决方案2】:

    乔是对的。您需要告诉 navigationController 推送视图,而不是 viewController 子类。 navigationController 应该为应用程序的分层结构部分处理您想要的所有视图控制器。你的 navigationController 应该首先使用它的 initWithRootViewController: 方法来加载你的 logincontroller 并显示它的视图。然后,当您想显示下一个视图时,您向 navigtionController 发送 pushViewController:animated: 消息,其中包含您要显示的视图的下一个 viewController。

    【讨论】:

      【解决方案3】:

      另一种方法是将您的第一个视图创建为持有 UITableView 的导航控制器,然后在 viewWillAppear 上检查用户是否已登录。如果他们尚未登录,请将您创建的 LoginViewController 显示为模态.使用模式的好处是根视图将是您的表格视图。如果您的应用程序有一个标签栏并且您的第一个导航控制器视图是登录视图控制器,那么每次您点击标签栏项目时,您的登录视图都会显示。

      希望这会有所帮助。

      【讨论】:

      • 感谢朋友的帮助,这是我的大师级顶点项目:D 不知道该怎么做,所以我改变了主意,用 java 做了一些事情。但是,当我有时间时,我会再试一次:D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多