1

我已经做了大约 3 个小时了,我终于向你们认输了。在我看来,有两个UITableView,一个是论坛版块,用来发表评论什么的,第二个UITableView是用来提人的。我遇到的问题是,tableview counts即使我只想更新 1 个表格视图,两者都受到影响。

我在viewdidload

self.mentionTableView.delegate = self;
self.mentionTableView.dataSource = self;
self.mentionTableView.tag = 1;

self.forumTable.delegate = self;
self.forumTable.dataSource = self;
self.forumTable.tag = 2;

如果我实际上没有加载feedArray从中forumTable获取数据的地方,那么提及部分将完美运行。我发现如果matchedNames.count<feedArray.count一切正常,但如果matchedNames.count>feedArray.count它崩溃,这是我得到的错误

-[__NSCFArray objectAtIndex:]: index (1) beyond bounds (1)

这意味着我只有 1 个项目feedArray并且matchedNames有多个。

代替

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

我已经使用这些代码来尝试使其工作,但仍然没有,我什至完成了它们的组合。

1)

if ([tableView isEqual: mentionTableView]){

    NSLog(@"%@",matchedNames);
    NSLog(@"%i",matchedNames.count);
    return [matchedNames count];


} else if([tableView isEqual:forumTable]){

        return [feedArray count];
    }

2)

if (tableView == mentionTableView){

    NSLog(@"%@",matchedNames);
    NSLog(@"%i",matchedNames.count);
    return [matchedNames count];



} else if(tableView == commentTable){

        return [feedArray count];
   }

3)

    if (tableView.tag == 1){

    NSLog(@"%@",matchedNames);
    NSLog(@"%i",matchedNames.count);
    return [matchedNames count];



} else if(tableView.tag == 2){

        return [feedArray count];
    }

我知道我不必这样做,else if但我只是想具体一点,也许可以避免这个问题。

这是我的cellForRowAtIndexPath

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

if (tableView.tag == 1){
    CGAffineTransform transform = CGAffineTransformMakeRotation(3.14);


    static NSString *CellIdentifier = @"CellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.transform = transform;

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

    return cell;

} else {
static NSString *CellIdentifier = @"commentCell";

commentsCustomCell *cell =(commentsCustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[commentsCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;

NSDictionary *feedPost = [feedArray objectAtIndex:indexPath.row];
NSString *checkIFempty = [feedPost objectForKey:@"isForum_empty"];

if (![checkIFempty isEqualToString:@"1"]) {
    cell.noCommentsLabel.text = nil;

} else {
    cell.noCommentsLabel.text = @"No Comments";
    cell.forumComment = nil;
}
NSString *username =[feedPost objectForKey:@"Username"];
NSString *final_time =[feedPost objectForKey:@"final_time"];
NSString *userIDforPic =[feedPost objectForKey:@"UserID"];

finalComment = [feedPost objectForKey:@"comment"];
cell.forumComment.text = finalComment;

return cell;
    }

}

如果我的问题令人困惑,我深表歉意,我没有睡 36 个小时。谢谢你看我的问题!

4

2 回答 2

2

你真的真的应该考虑重构你的代码并将这两个 tableViews 分开在不同的 viewControllers 中。

例如,您可以在主 viewController 中使用 containerViews,并将 tableview 放在容器视图控制器中。

TableView delegates 使用了很多代码,给同一个控制器设置不同的 tableViews 总是会这样,弄乱代码,给更多的麻烦。

于 2013-08-09T12:20:20.997 回答
1

您可以使用一些技术来帮助清理代码并减少混乱的解决方案。我会很奇怪地解释这一点。

第一个简单的步骤是创建一个属性或方法,根据 tableView 或标签为您提供数据数组:

- (NSArray *)dataForInteger:(NSUInteger)value {
    return @[self.matchedNames, self.feedArray][value];
}
// you can also make this a readonly property for easier access

为了使用上述方法,您需要确保需要的表的标签matchedNames0feedArray1(或者您可以使用简单的if/else语句并制作您想要的标签。

现在看看这使您的未来逻辑变得多么容易!

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    [[self dataForInteger:tableView.tag] count];
}

而已!

接下来,您可能会创建一个类似的方法:

- (UITableViewCell *)emptyCellForTableView:(UITableView *)tableView {
    NSString *cellIdentifier = @[@"CellIdentifierONe", @"CellIdentifierTWO"][tableView.tag];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell) {
        // the only messy looking logic
        if (!tableView.tag) { // tableView.tag == 0
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

            CGAffineTransform transform = CGAffineTransformMakeRotation(3.14);
            cell.transform = transform;
        } else {
            // make sure "CommentsCustomCell" is a class and not an instance (like your example)
            cell = [[CommentsCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }
    }

    return cell;
}

然后在你的tableView:cellForRowAtIndexPath:

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

    UITableViewCell *cell = [self emptyCellForTableView:tableView];
    NSArray *dataArray = [self dataForInteger:tableView.tag];

    // setup all custom UITableViewCell's to have a property or setter "data"
    if ([cell respondsToSelector:@selector(setData:)]) {
       // I will explain this a bit later
       cell.data = dataArray[indexPath.row];
    } else {
       // based on your example this was an NSString array
       self.textLabel.text = dataArray[indexPath.row];
    }
}

现在cell.data = dataArray[indexPath.row];按照 Apple 的示例,如何设置 custom 数据UITableViewCells。只需创建一个名为 data 的属性,它的 setter 看起来像这样(例如):

// CommentsCustomCell.m

- (void)setData:(id /*or custom class, in this case you use NSDictionary*/)data {
   _data = data;

    // NTOE: I just copied your example above, I am sure there is a nicer way to do this but you get the idea.


    NSDictionary *feedPost = (NSDictionary *)data;
    NSString *checkIFempty = [feedPost objectForKey:@"isForum_empty"];

    if (![checkIFempty isEqualToString:@"1"]) {
        cell.noCommentsLabel.text = nil;

    } else {
        cell.noCommentsLabel.text = @"No Comments";
        cell.forumComment = nil;
    }
    NSString *username =[feedPost objectForKey:@"Username"];
    NSString *final_time =[feedPost objectForKey:@"final_time"];
    NSString *userIDforPic =[feedPost objectForKey:@"UserID"];

    finalComment = [feedPost objectForKey:@"comment"];
    cell.forumComment.text = finalComment;
}

像这样的解决方案如此漂亮的原因是,如果您想使用不同的自定义UITableViewCell,您需要做的就是更改 Empty Cell Creation 方法来创建该类,基本上就是这样(这也允许您你所有的手机都是IBOutlet私人的!)。只要新类有一个data属性,你的主控制器就不会关心!它只是通过发送数据。这也允许您适当地缩放它。如果所有tableView's 都使用自定义单元格,您可以轻松地在同一个表格视图中拥有十几个表视图,viewController而无需太多额外的逻辑(只需将其添加到数组中,设置标签,并确保单元格创建方法创建适当的单元格!)。

我很快就输入了这个,所以可能有一些缺失的逻辑或错别字。如果他们被指出,我会解决任何问题。祝你好运。

于 2013-08-09T14:56:07.590 回答