当UITableView为空时,显示UIImage

时间:2011-11-14 16:10:07

标签: iphone objective-c xcode

这与我的另一个问题有关,但是没有以有用的方式回答(当UITableView为空时的消息)。

我正在尝试显示一个UIImage图形,当它为空时,你没有在UITableView上保存任何书签。我有NSNotification设置,以便在添加或删除书签时,会发送一条消息,以便更新UITableView。

我一直在尝试使用此代码。为什么这不起作用?

- (void)bookmarksChanged:(NSNotification*)notification
{
    [self.tableView reloadData];

    UIImageView* emptyBookmarks = [[UIImageView alloc] initWithFrame:CGRectMake(75, 100, 160, 57)];
    emptyBookmarks.alpha = 1;
    emptyBookmarks.image = [UIImage imageNamed:@"emptyBookmark.png"];
    [self.view addSubview:emptyBookmarks];
    [emptyBookmarks release];

    if ([self.dataModel bookmarksCount] == 0)
    {
        emptyBookmarks.alpha = 1;
    }
    else
    {
        emptyBookmarks.alpha = 0;
    }
}

我可能以错误的方式接近......但如果可以挽救,我做错了什么?

当我最初有一个空的书签表视图时,没有显示图像。添加书签然后将其删除后,图像显示。 Grrh。

7 个答案:

答案 0 :(得分:3)

另一种方法(和IMO正确的方法)来操作UITableView上的backgroundView属性。

虽然使用自定义图像单元制作单个单元格肯定会起作用,但我认为它过分复杂了UITableViewController数据源的逻辑。感觉就像一块垃圾。

根据UITableView文档:

A table view’s background view is automatically resized to match the 
size of the table view. This view is placed as a subview of the table 
view behind all cells , header views, and footer views.

Assigning an opaque view to this property obscures the background color 
set on the table view itself.

虽然您可能不想将其设置为UIImageView,但很容易制作包含您想要的UIImageView的UIView。

答案 1 :(得分:0)

您确定[self.dataModel bookmarksCount]等于0吗?

答案 2 :(得分:0)

首先,如果您要这样做,您需要在更新图像或模型等之后重新加载tableView,而不是之前。 但是你可能会让事情变得比他们需要的更复杂! 为什么不检查第0部分和indexPath.row 0的数据是否为空,如果是,则在cellForRowAtIndexPath中显示相应的文本消息。

//首先确保即使dataModel为空,也总会返回一行。

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
        {    
             NSInteger numRows = 0;

              if ([self.dataModel lastObject]) {
                   // Return the number of rows in the section.
                   numRows = [self.dataModel count]; // etc.
               }

            if (numRows < 1) numRows = 1;

            return numRows;
}

//如果有数据则显示数据,否则显示空的消息。

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
                        static NSString *CellIdentifier = @"Cell";

                         UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
                         if (cell == nil) {
                         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
                         }

                        if ([self.dataModel lastObject]) {


                           // setup the cell the normal way here.


                        } else { // the datasource is empty - print a message

                            cell.textLabel.text = nil;
                            cell.detailTextLabel.text = NSLocalizedString(@"You haven't saved any bookmarks", @"");
                            cell.detailTextLabel.textColor = [UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0.7];
                            cell.accessoryType = UITableViewCellAccessoryNone;
                        }
return cell;

}

答案 3 :(得分:0)

虽然我同意你可能会采取错误的方式,但

您的图片已分配并添加到您更改的书签中,当最初没有书签时,您的通知不会触发。因此,您没有看到图像。当您的表格视图显示或显示时,请调用bookmar。

答案 4 :(得分:0)

实现此目的的最佳方法可能是在您的numberOfRowsInSection方法中执行检查,以便在数据源为空时返回1。然后在cellForRowAtIndexPath中检查您的数据源是否为空,如果是,则创建一个包含您想要的任何内容的自定义单元格。在heightForRowAtIndexPath中,如果数据源为空,则需要返回自定义单元格高度,但前提是您希望单元格大于默认值。至少这就是我接近它的方式。

答案 5 :(得分:0)

当书签计数为零时,在行方法中添加一个:

            - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{   
    int c;
    c = bookmarks.count;
    if(c == 0){
    c = 1;
    }
return c;
}

然后再次检查你的cellforrowatindexpath。

答案 6 :(得分:0)

在这种情况下需要注意的另一件事是,如果您正在使用核心数据并且数据源正在以实体为基础,那么您需要确保模型匹配。在某些情况下,你可能会得到一些奇怪的副作用行为。如果您允许编辑并且核心数据具有空模型但是您的tableview仍然显示单元格,则尤其如此。