iPhone在表格视图项目单击上打开多个视图控制器

Posted

技术标签:

【中文标题】iPhone在表格视图项目单击上打开多个视图控制器【英文标题】:iPhone open multiple view controllers on table view item click 【发布时间】:2013-11-22 13:14:47 【问题描述】:

是否可以根据女巫表视图单元格用户点击打开不同的视图控制器?我试图这样做:

[self presentViewController:obj animated:YES completion:nil];

但是当呈现下一个视图时,没有导航栏,我无法返回表格视图。

编辑:

这是我正在使用的 MasterViewController 类

#import "MasterViewController.h"

@interface MasterViewController () 
    NSArray *viewArray;

@end

@implementation MasterViewController
@synthesize items,itemImges;

- (void)awakeFromNib

    if ([[[UIDevice currentDevice] systemVersion] compare:@"7" options:NSNumericSearch] != NSOrderedAscending) 
        self.preferredContentSize = CGSizeMake(320.0, 480.0);
    
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
        self.clearsSelectionOnViewWillAppear = NO;
    
    self.title = NSLocalizedString(@"MasterTitle",@"Options:");

    [super awakeFromNib];


- (void)viewDidLoad

    [super viewDidLoad];

    items = [NSArray arrayWithObjects:@"Media Explorer",@"Live TV",@"Settings",nil];
    itemImges = [NSArray arrayWithObjects:
             [UIImage imageNamed:@"listicon_guide.png"],
             [UIImage imageNamed:@"listicon_livetv.png"],
             [UIImage imageNamed:@"listicon_settings.png"],
             nil];

// Do any additional setup after loading the view, typically from a nib.
    self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];

    MediaExpDetailViewController *DVCA = [self.storyboard instantiateViewControllerWithIdentifier:@"MediaExpDetailViewController"];
    LiveTVDetailViewController *DVCB = [self.storyboard instantiateViewControllerWithIdentifier:@"LiveTVDetailViewController"];
    SettingsDetailViewController *DVCC = [self.storyboard instantiateViewControllerWithIdentifier:@"SettingsDetailViewController"];

    //Create Array of views
    viewArray = [NSArray arrayWithObjects:DVCA, DVCB, DVCC, nil];


#pragma mark - Table View

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return items.count;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    NSString *object = items[indexPath.row];
    UIImage *image = itemImges[indexPath.row];
    cell.textLabel.text = [object description];
    cell.imageView.image = image;

    return cell;


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    //for iPad
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
        //something goes here
    
    else  //for iPhone
        UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
        MediaExpDetailViewController *objSynergy = (MediaExpDetailViewController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"MediaExpDetailViewController"];
        [self.navigationController pushViewController:objSynergy animated:YES];
    


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender



@end

【问题讨论】:

推送(进入导航控制器)而不是呈现 【参考方案1】:

首先在 Interface Builder 中为 Next View 控制器设置 Storyboard ID,然后。

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

   // Check Row and Select Next View controller
   if (indexPath.row == 1)
        
       // Push Selected View
       UIViewController *view1 = [self.storyboard instantiateViewControllerWithIdentifier:@"StoryboardID"];
       [self.navigationController pushViewController:view1 animated:YES];
   

【讨论】:

【参考方案2】:

那是因为

[self presentViewController:obj animated:YES completion:nil];

以模态方式呈现新的视图控制器(在现有可见控制器之上)。如果您想使用导航控制器推送到新的视图控制器,您将需要使用它。当然,您需要确保您从中推送的视图控制器嵌入在 UINavigationController 中。

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

回答你的第一个问题,是的,这绝对是可能的。只需在您的 didSelectRowAtIndexPath: UITableViewDelegate 方法中添加一些条件逻辑即可。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    if (someCondition) 
        [self.navigationController pushViewController:obj animated:YES];
    else
        [self.navigationController pushViewController:otherObj animated:YES];
    

【讨论】:

当我做 [self.navigationController pushViewController:otherObj animated:YES];我在日志中收到错误消息:2013-11-22 14:23:53.849 iAmuse[1651:c07] 嵌套推送动画可能导致导航栏损坏 2013-11-22 14:23:54.203 iAmuse[1651:c07] 完成处于意外状态的导航转换。导航栏子视图树可能会损坏。 2013-11-22 14:23:54.204 iAmuse[1651:c07] 对 的开始/结束外观转换的不平衡调用。 @lugonja 您在函数中调用了多少次pushViewController: 在我的案例陈述中只有一次。也许我在这里遗漏了一些东西。此外,当我单击项目时,我没有得到我的 obj 视图控制器,而是来自主/详细应用程序模板的默认视图控制器。 @lugonja 你是如何访问它的?是否有可能您添加了对 pushViweController 的调用,而对 presentViewController 的调用保持不变?【参考方案3】:

模态显示的视图控制器默认没有导航栏。您必须将它们嵌入到 UINavigationController 中才能拥有一个。您还应该自己实现如何关闭呈现的视图控制器,在适当的时候调用 dismissViewControllerAnimated

但是,如果您不特别需要模态功能,我建议您推送您的视图控制器(使用 pushViewControllerAnimated),而不是模态显示它们。

【讨论】:

以上是关于iPhone在表格视图项目单击上打开多个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

iPhone,在表格视图中单击编辑/完成按钮的钩子

单击另一个 Web 视图上的图像时在 Web 视图中打开图像?

普通视图控制器内的表格视图

单击表格视图行时如何推回视图?

关闭删除多个视图

是否有用于在表格视图控制器上编辑字段的 iPhone/iPad 库?