从 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】:首先,将delegate
和datasource
设置为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];
设置delegate
和datasource
。
【讨论】:
以上是关于从 UITableView(不是 UITableViewController)转到 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章
UINavigationController 如何成为 UITableView 的 navigationController?