TableViewController的viewDidLoad没有触发

j.g*_*ima 5 objective-c uitableview viewdidload ios

我一直在关注这个教程,有一个幻灯片菜单.我添加了一个TableViewController,它将显示文章列表.由于某种原因,viewDidLoad没有开火.

在本教程中SideViewController,控制将显示哪个控制器,如果具有segue标识符"showPhoto",它将加载特定图像.

// Set the photo if it navigates to the PhotoView
if ([segue.identifier isEqualToString:@"showPhoto"]) {
    PhotoViewController *photoController = (PhotoViewController*)segue.destinationViewController;
    NSString *photoFilename = [NSString stringWithFormat:@"%@_photo.jpg", [menuItems objectAtIndex:indexPath.row]];
    photoController.photoFilename = photoFilename;
}
Run Code Online (Sandbox Code Playgroud)

我想为重新创建同样的东西,TableViewController并尝试强制viewDidLoad控制器,如此处所示强制viewDidLoad在iOS上触发,但它仍然无法正常工作:

if ([segue.identifier isEqualToString:@"showList"]) {
    TableViewController *tableController = (TableViewController*)segue.destinationViewController;
    [tableController view];
}
Run Code Online (Sandbox Code Playgroud)

TableViewController viewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Change button color
    _sidebarButton.tintColor = [UIColor colorWithWhite:0.1f alpha:0.9f];

    // Set the side bar button action. When it's tapped, it'll show up the sidebar.
    _sidebarButton.target = self.revealViewController;
    _sidebarButton.action = @selector(revealToggle:);

    // Set the gesture
    [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];

    // Set this view controller object as the delegate and data source for the table view
    self.listTableView.delegate = self;
    self.listTableView.dataSource = self;

    // Create array object and assign it to _feedItems variable
    _feedItems = [[NSArray alloc] init];

    // Create new HomeModel object and assign it to _homeModel variable
    _homeModel = [[HomeModel alloc] init];

    // Set this view controller object as the delegate for the home model object
    _homeModel.delegate = self;

    // Call the download items method of the home model object
    [_homeModel downloadItems];
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,正在使用的其他两个控制器(PhotoViewControllerMapViewController)按预期工作......可能有一些设置而不是我缺少的.

我刚刚开始在iOS上,不幸的是无法解决这个问题.

项目下载

sta*_*Man 2

有多个问题TableViewController根据您共享的项目档案

TableViewController.h

@interface TableViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, HomeModelProtocol>
@property (weak, nonatomic) IBOutlet UIBarButtonItem *sidebarButton;
@property (weak, nonatomic) IBOutlet UITableView *listTableView;
@end
Run Code Online (Sandbox Code Playgroud)

应该:

//subclass should be UITableViewController
@interface TableViewController : UITableViewController <HomeModelProtocol>
@property (weak, nonatomic) IBOutlet UIBarButtonItem *sidebarButton;
//not needed
//@property (weak, nonatomic) IBOutlet UITableView *listTableView;
@end
Run Code Online (Sandbox Code Playgroud)

TableViewController.m

在 中-viewDidLoad,观察:

-(void)viewDidLoad
{
    //...

    //crashes when adding gesture to a tableView (this is not part of the core problem
    //but will be one if not handled) for now... comment it
    //[self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];

    //not needed as it's done via IB (but this is not part of the problem)
    //self.listTableView.delegate = self;
    //self.listTableView.dataSource = self;

    //...
}
Run Code Online (Sandbox Code Playgroud)

故事板

选择UITableViewController

  • 将自定义类指定为TableViewController (通过 Identity Inspector)
  • 设置Top BarTranslucent Navigation Bar (通过属性检查器)
  • 添加一个UINavigationItem
  • 在其上添加一个UIBarButtonItem并将其设置为菜单(就像您在另一个中所做的那样viewControllers
    • IBOutlet对象连接sidebarButton到此UIBarButtonItem

SidebarViewController.m

在你的-prepareForSegue:sender:方法中,如果你不传递数据,TableViewController那么你不需要做任何事情

- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender
{
    //...

    if ([segue.identifier isEqualToString:@"showList"]) {
        //TableViewController *tableController = (TableViewController*)segue.destinationViewController;

        //this is definitely not needed whether you pass data or not
        //[tableController view];
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)