Xib 到 ViewController

Posted

技术标签:

【中文标题】Xib 到 ViewController【英文标题】:Xib to ViewController 【发布时间】:2017-06-08 07:03:49 【问题描述】:

我有TableViewCell.xib 文件,其中每个单元格中可以有姓名、联系人等数据的摘要。现在,如果我触摸该单元格,它将转到另一个ViewController,其中将包含该单元格数据的详细信息。( ViewController 显示的内容无关紧要)。我想从这个 xib 文件的单元格触摸转到另一个 ViewController。我怎样才能做到这一点。

编辑:

CallHistoryTableViewCell.h

@interface CallHistoryTableViewCell : UITableViewCell
    @property(nonatomic, strong) IBOutlet UILabel *contactName;
    @property(nonatomic, strong) IBOutlet UILabel *contactNumber;
@end

这个类有 CallHistoryTableViewCell.xib 文件。

CallHistoryVC.h

@interface CallHistoryVC : UIViewController
@end

CallHistoryVC.m

#import "CallHistoryVC.h"
#import "CallHistoryTableViewCell.h"

@interface CallHistoryVC ()<UITableViewDelegate, UITableViewDataSource,CallingViewControllerDelegate> 
AppDelegate *appDelegate;


@property (nonatomic, strong) NSMutableArray<RecentCall> *sortedEventArray;
@property (weak, nonatomic) IBOutlet UITableView *tView;

- (void)viewDidLoad 
[super viewDidLoad];
appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
//---add one contact---//
[self defaultViewSetting];
_tView.delegate = self;
_tView.dataSource = self;


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

return 1;


 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
return 75;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
return _sortedEventArray.count;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
static NSString *CellIdentifier = @"CallHistoryTableViewCell";

return cell;


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
DetailsOfHistory *storyViewController = [mainStoryBoard instantiateViewControllerWithIdentifier:@"DetailsOfHistory"];
//[self presentViewController:storyViewController animated:YES completion:nil]; //  present it
[self.navigationController pushViewController:storyViewController animated:YES];// or push it

NSLog(@"%ld",(long)indexPath.row);

一切正常,但在didSelectRowAtIndexPath indexPath 没有显示这意味着触摸不起作用。通过单击单元格,我想转到 stroyboard 中的另一个视图控制器。

【问题讨论】:

你读过 UITableView 文档吗?通过这个,developer.apple.com/documentation/uikit/uitableviewdelegate/… 实现UITableViewDelegate的didSelectRowAtIndexPath方法 问题是我无法将 xib 链接到 ViewController。是否可以将 xib 链接到情节提要中的 ViewController? 【参考方案1】:

如下实现 didSelectRowAtIndexPath

      - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
            
UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    StoryViewController *storyViewController = [mainStoryBoard instantiateViewControllerWithIdentifier:@"StoryViewController"]; 
    [self presentViewController:storyViewController animated:YES completion:nil]; //  present it  
     //[self.navigationController pushViewController:storyViewController animated:YES];// or push it
            

在您的 xib 文件中的表格视图单元格中将单元格 ID 名称设置为 CallHistoryTableViewCell。 现在在您的 viewDidLoad 中注册您的自定义 tableView 单元格

[self.tableView registerNib:@"CallHistoryTableViewCell" forCellReuseIdentifier:@"CallHistoryTableViewCell"];

并将以下代码放入您的 cellForRowAtIndexPath

CallHistoryTableViewCell *cell = (CallHistoryTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"CallHistoryTableViewCell"]; 
return cell;

【讨论】:

我可以使用情节提要来创建该视图控制器以从 xib 移动到该视图控制器吗?我不清楚 实际上,当我单击 xib 中的 TableViewCell 时它不起作用,这意味着在 didSelectRowAtIndexPath 中,如果我打印 indexPath 它也不起作用。 但是您尚未在共享的代码中提及它。顺便说一句,如果我的回答有帮助,那么您可以给我一个赞成票。谢谢 但我在另一个应用程序中看到他们使用滑动手势但也可以单击单元格。所以我的问题并不正确,我也必须使用那个手势。那我该怎么做呢 您可以为您的问题设置另一个问题 didSelectRowAtIndexPath 不起作用。它与这个问题无关,伙计,顺便说一下,我认为你是 ios 的新手,而且堆栈溢出,所以你无法理解我的帮助。谢谢。【参考方案2】:

如果您想将自定义单元格注册为 xib,请在 viewDidLoad 中执行以下操作

[self.tableView registerNib:@"YourNibName" forCellReuseIdentifier:@"YourCellId"];

您的Xib 名称:

你的Cellid:

顺便说一句,在你的 cellForRowAtIndexPath: 中这样做。

yourCustomCell *cell = (yourCustomCell *)[tableView dequeueReusableCellWithIdentifier:@"yourCellId"];

【讨论】:

以上是关于Xib 到 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

将 XIB 加载到另一个 XIB 的视图中

如何将 xib 的子视图显示到另一个 xib 的表格单元加载中

无法将 xib 文件添加到目标成员资格

将两个 xib 文件中的两个 tableviews 添加到主 xib 视图

如何将视图 XIB 作为子视图加载到视图控制器 XIB 中

如何将 UIView XIB“导入”到 UIViewController XIB?