从 UITableView(不是 UITableViewController)转到 UIViewController

Posted

技术标签:

【中文标题】从 UITableView(不是 UITableViewController)转到 UIViewController【英文标题】:Go from UITableView(not a UITableViewController) to a UIViewController 【发布时间】:2015-05-13 01:16:07 【问题描述】:

我在UIViewController 中有一个UITableView。 当用户按下UITableView 内的一个单元格时,我想显示另一个UIViewController。所以我有UIViewController“A”,里面有UITableView“A”,我想点击UITableView“A”中的一个单元格并被推送到UIViewController“B”。我尝试简单地将UITableViewCell 的segue 连接到UIViewController 但这导致按下单元格时没有任何反应。我也尝试了以下代码,但没有成功。同样,什么也没发生,没有错误。

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

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
    AlbumsViewController *albumsViewControllerObj = [mainStoryboard instantiateViewControllerWithIdentifier:@"AlbumsViewController"];
   [albumsViewControllerObj performSegueWithIdentifier:@"showAlbumDetail" sender:self];


到目前为止,我发现的所有建议都涉及从表视图控制器转到另一个视图,我知道该怎么做并且从未遇到过问题。出于某种原因,尽管我在从表视图移动到另一个视图控制器时遇到了问题。如果它很重要(我认为它可能),TableView“A”的委托和数据源是视图控制器“A”。任何建议都会很棒,谢谢!

【问题讨论】:

你设置了tableView的delegate吗? 你能检查我的答案吗 你的问题解决了吗 Can I use multiple segues with one UITableViewDelegate? 的可能重复项 我投了赞成票,希望也能在我的回答中得到它 【参考方案1】:

首先,将delegatedatasource 设置为self。

其次,只需将一个segue从ViewControllerA拖到ControllerB

第三,选择时只执行segue

 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  [self  performSegueWithIdentifier:@"showAlbumDetail" sender:nil];
    

然后,在prepareForSegue中,将数据传递给destinnatinVC

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    if (segue.identifier == yourid) 
        ViewControllerB *  = segue.destinationViewController;
        //Pass data
    

【讨论】:

【参考方案2】:

以编程方式设置委托和数据源,如下所示:

- (void)viewDidLoad 
    ...
    self.myTableView.delegate = self;
    self.myTableView.datasource = self;

或者您可以在情节提要中通过 ctrl 单击并从 tableView 拖动到 viewController 来完成。

然后您可以通过编程方式或在情节提要中转到 viewController b。

在语法上:

首先转到情节提要并ctrl单击并从viewController a拖动到viewController b。然后在你的代码中写下:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    [self  performSegueWithIdentifier:@"nextViewControllerID" sender:nil];

故事板:

ctrl 单击并从单元格拖动到 viewController b。

【讨论】:

【参考方案3】:

首先检查您是否有可能不小心输入了didDeselectRowAtIndexPath? .检查您期望的方法名称 didSelect 是否可能以某种方式意外得到 didDeselect

SimpleTableController.h

#import <UIKit/UIKit.h>

@interface SimpleTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@end

SimpleTableViewController.m 中,检查didSelectRowAtIndexPath 是否被调用,如下所示

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    
        UIAlertView *messageAlert = [[UIAlertView alloc]
                                        initWithTitle:@"Row Selected" message:@"You've selected a row" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

        // Display Alert Message
        [messageAlert show];

    

设置delegatedatasource

【讨论】:

以上是关于从 UITableView(不是 UITableViewController)转到 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

UITableView API大百科

iOS开发UI篇—UITableview控件使用小结

刷新 UITableView 而不刷新节标题

UINavigationController 如何成为 UITableView 的 navigationController?

iOS 8 UITableView 背景颜色外观

以编程方式添加带有自动布局的 UITableView