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

Creating UITableViewCell through button press in another ViewController/ referencing UITableView in another ViewController

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

所以我的 First 中有一个按钮ViewController

- (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];
    }
}

}

todayEvents、tomorrowEvents 和 futureEvents 都是数组,我会将我的事件分类到其中。

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

之后,我希望事件以 UITableViewCell 的形式显示在 UITableView 上,所以我决定在我的 SecondViewController(带有 UITableView 的 viewcontroller)

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 的另一个实例可能没有帮助。

也请告诉我除了我现在使用的方法之外,是否还有更简单的方法来实现我打算用我的应用程序做的事情。

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

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