通过在另一个 ViewController 中按下按钮/在另一个 ViewController 中引用 UITableView 创建 UITableViewCell

Posted

技术标签:

【中文标题】通过在另一个 ViewController 中按下按钮/在另一个 ViewController 中引用 UITableView 创建 UITableViewCell【英文标题】:Creating UITableViewCell through button press in another ViewController/ referencing UITableView in another ViewController 【发布时间】:2016-03-13 13:27:10 【问题描述】:

很抱歉,如果这个问题对你们所有人来说太简单了,但它已经困扰了我几个星期。

所以我的 FirstViewController 中有一个按钮

- (IBAction)levelOneButtonPress:(id)sender 
SecondViewController *second = [[SecondViewController alloc] init];

if(![self.eventField.text isEqualToString:@""])

    events *createdEvent = [[events alloc] init];
    createdEvent.eventDetails = self.eventField.text;
    createdEvent.dateDetails = self.dateField.text;
    createdEvent.timeDetails = self.timeField.text;
    [createdEvent combineDateWithTime];
    [createdEvent dateFormat];

    createdEvent.gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    if ([createdEvent.gregorian isDateInToday:createdEvent.eventDate] == YES) 
        NSLog(@"Date is in today");
        [todayEvents addObject:createdEvent];
    
    else if ([createdEvent.gregorian isDateInTomorrow:createdEvent.eventDate] == YES)
    
        [tomorrowEvents addObject:createdEvent];
    
    else
    
        [futureEvents addObject:createdEvent];
    

tod​​ayEvents、todayEvents 和 futureEvents 都是我将事件分类到的数组。

我希望我的用户将详细信息输入到文本框中,然后我将对其进行整理,进行一些日期格式化,然后添加到数组中。

之后,我希望事件在 UITableView 上显示为 UITableViewCell,所以我决定将其写在我的 SecondViewController(其中包含 UITableView 的视图控制器)

NSMutableArray *todayEvents;
NSMutableArray *tomorrowEvents;
NSMutableArray *futureEvents;

@synthesize eventTable;

-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView

return 3;


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

switch (section) 
case 0:
    return [todayEvents count];

case 1:
    return [tomorrowEvents count];

case 2:
    return [futureEvents count];

default:
    return 0;



-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

switch (section) 
    case 0:
        return @"Events Today";

    case 1:
        return @"Events Tomorrow";

    case 2:
        return @"Events In The Future";

    default:
        return @"Unknown";




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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"defaultCell"];

switch (indexPath.section) 

    case 0:
        cell.textLabel.text = [NSString stringWithFormat:@"%@",[todayEvents objectAtIndex:indexPath.row]];
        cell.detailTextLabel.text = [NSString stringWithFormat:@"%@",[todayEvents objectAtIndex:indexPath.row]];
        break;

    case 1:
        cell.textLabel.text = [NSString stringWithFormat:@"%@",[tomorrowEvents objectAtIndex:indexPath.row]];
        cell.detailTextLabel.text = [NSString stringWithFormat:@"%@",[tomorrowEvents objectAtIndex:indexPath.row]];
        break;

    case 2:
        cell.textLabel.text = [NSString stringWithFormat:@"%@",[futureEvents objectAtIndex:indexPath.row]];
        cell.detailTextLabel.text = [NSString stringWithFormat:@"%@",[futureEvents objectAtIndex:indexPath.row]];
        break;

    default:
        break;

return cell;


但是,当我运行我的应用程序时,当我按下按钮时 UITableView 甚至没有生成行。

目前我猜这是因为我必须重新加载 UITableView,但我似乎无法在我的 FirstViewController 中引用它来发送消息以重新加载。

我是否在我的 FirstViewController.m 文件中创建 SecondViewController 的实例,然后在该实例上调用 reloadData 方法?它会导致 UITableView 重新加载吗?我对这部分有点困惑,因为我不确定编译器运行项目时后台会发生什么。它是否在运行时初始化所有 ViewController 的实例?如果是这种情况,初始化 ViewController 的另一个实例可能无济于事。

还请告诉我,除了我现在使用的方法之外,是否还有更简单的方法可以实现我打算对我的应用执行的操作。

【问题讨论】:

你能解释一下你的视图控制器层次结构吗?哪个先显示?你如何从一个到另一个? 嗨! @pbasdf 所有视图控制器都连接到选项卡式视图控制器。首先显示带有按钮的视图控制器。我通过使用 xcode 给出的默认 tabbedviewcontroller 切换选项卡进入 secondviewcontroller 【参考方案1】:

从您的FirstViewController,您可以通过其tabBarController 属性获取对标签栏控制器的引用。 UITabBarController 有一个 viewControllers 属性,它是每个选项卡中的视图控制器的数组。因此,如果您的 SecondViewController 在第二个选项卡(索引 1)中,您可以通过以下方式从 FirstViewController 访问它:

let secondVC = self.tabBarController!.viewControllers[1] as! SecondViewController

【讨论】:

感谢您的回答!我实际上让它工作,但我必须创建一个新的实例方法来调用 reloadData 方法,因为 self.tabBarController.viewControllers[1] 不识别 reloadData 方法。一旦我有足够的声望点就会投票。非常感谢

以上是关于通过在另一个 ViewController 中按下按钮/在另一个 ViewController 中引用 UITableView 创建 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

在swift5中按下特定按钮时如何使用代码呈现tabBarViewController(在情节提要中创建)?

从另一个类缩放 MkMapView

在 UICollectionViewController 中按下 UICollectionView 后没有响应

通过 UIScrollView 推送 ViewController

如何通过在android中按下按钮来添加纯文本视图?

如何在 alertview 中返回 viewcontroller