2

我正在尝试将数组的内容显示到 uitableview 上。如果我单独分配值,它工作正常,但是当我尝试从数组中显示它们时,xcode 退出,调试报告中除了 (lldb) 之外没有任何内容。它编译并运行良好,直到我进入带有 tableview 的页面。我查看了错误,它似乎与内存分配有关,但由于必须为某些 JSON 类启用 ARC 才能运行,我无法手动释放任何内容。任何人都可以看看,看看可能是什么问题。

- (void)viewDidLoad
{
    [super viewDidLoad];
    theArray = [[NSArray alloc] initWithObjects:@"1","2","3","4",nil];

    // Do any additional setup after loading the view.
}


#pragma mark Table view methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [theArray count];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {



    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


    // Set up the cell...
    self.recentSearchesTable.backgroundColor =[UIColor clearColor];
    self.recentSearchesTable.separatorColor = [UIColor clearColor];
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:15];
    cell.textLabel.text = [theArray objectAtIndex:indexPath.row];

    cell.contentView.backgroundColor = [UIColor clearColor];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // open a alert with an OK and cancel button
    NSString *alertString = [NSString stringWithFormat:@"Clicked on row #%d", [indexPath row]];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:alertString message:@"" delegate:self cancelButtonTitle:@"Done" otherButtonTitles:nil];
    [alert show];

}
4

3 回答 3

4

viewDidLoad您的数组中包含非对象项,也进行更改:

theArray = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"4",nil];

注意@数组中每一项的前面,表明它们是NSString文字(而不是 c 字符串)。

于 2013-01-23T20:18:57.657 回答
1

首先,由于外部类,您不需要为您的项目禁用 ARC。您可以通过设置 -fno-objc-arc 标志来排除这些类。

返回您的答案如果可以从以前的单元格中重复使用,则应分配一个新单元格。如果 dequeueReusableCellWithIdentifier:CellIdentifier 未返回单元格,则应分配新单元格。

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  if (cell == nil)  {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:Cellidentifier] autorelease];
  }

除此之外,当您在 viewDidLoad 中初始化数据源数组时,您需要在每个元素之前添加 @ 以指示 NSString。

于 2013-01-23T20:11:40.200 回答
1

您首先在这里犯了两个错误,您需要以这种方式初始化数组。

theArray = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"4",nil];

另一个错误是您需要在单元格为 nil 时对其进行初始化

if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

如果你想要整个代码,那么你需要像这样实现。

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



    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    // Set up the cell...

    cell.textLabel.text = [theArray objectAtIndex:indexPath.row];

    cell.contentView.backgroundColor = [UIColor clearColor];

    return cell;
}
于 2013-01-23T20:31:16.400 回答