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

时间:2016-03-13 13:27:11

标签: ios objective-c uitableview uiviewcontroller uitabbarcontroller

对不起,如果这个问题太简单了,你们所有人都无法回答,但这已经困扰了我几个星期。

所以我的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];
    }
}

}

todayEvents,tomorrowEvents和futureEvents是我将事件分类的所有数组。

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

之后,我希望事件在UITableView上显示为UITableViewCell,所以我决定在我的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重新加载吗?我对此部分有点困惑,因为我不确定编译器运行项目时后台会发生什么。是否在运行时初始化所有ViewControllers的实例?如果是这种情况,初始化ViewController的另一个实例可能没有帮助。

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

1 个答案:

答案 0 :(得分:0)

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

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