【问题标题】:Go from UITableView(not a UITableViewController) to a UIViewController从 UITableView(不是 UITableViewController)转到 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”。任何建议都会很棒,谢谢!

【问题讨论】:

标签: ios objective-c iphone uitableview


【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多