1

我有一个应用程序,在加载时会显示一个 UITableView,其中包含用户的数据。

但是,当用户第一次加载应用程序时(在他们创建任何数据之前),我想显示背景图像而不是空表(带有指向“添加记录”导航栏按钮的箭头) . 一旦用户添加了他们的第一条记录,就会显示 tableview。我已经看到很多应用程序都这样做了——我目前能想到的唯一例子是 Cha-Ching,在你设置任何预算/等之前。不过,我一生都无法弄清楚如何做到这一点。

我最初在主窗口的 xib 中添加了一个 navigationcontroller,它的 rootViewController 是一个自定义的 viewcontroller/xib。这个 rootViewController 包含背景图像,上面有一个隐藏的 tableview,以及一个管理 tableview 的自定义 tableviewcontroller。这似乎工作得很好,如果有数据,它将加载并显示在表格中。但是,如果我将数据滚动到屏幕外,应用程序会崩溃,并出现以下错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'*** -[UITextEffectsWindow tableView:cellForRowAtIndexPath:]: unrecognized selector sent to instance 0xd2d130'

我不知道 UITextEffectsWindow 是什么,也不知道它为什么要管理我的 tableview。我认为在我的视图层次结构中可能会错误地连接某些东西......

如果有更简单/更直接的方法可以做到这一点,如果有人能解释一下,我将不胜感激。你会怎么做?

提前致谢。

4

5 回答 5

1

到目前为止,这是我满意的一种解决方案。

首先,我创建了一个与我的 TableView 大小相同的透明视图。每当 TableView 的数据源中没有数据时,我都会将此视图添加为 TableView 的同级。当数据可用时,我完全删除了视图,因为透明度会影响 TableViews 滚动动画的平滑度。

我只是在这个视图中添加了一个透明标签,它说明了“无可用数据”的效果。给这个标签添加一点阴影确实有助于强化标签“浮动”在空 TableView 之上的概念。

我喜欢你使用图像的方法。做得好,如果您不必像我目前那样本地化字符串,它可能会为您节省一些工作。

于 2009-05-18T23:33:39.050 回答
1

为了实现这一点,我使用 UITableViewController 子类作为我唯一的视图(根据 Apple 模板在 UINavigationController 内),我使用了以下方法:

  1. 在包含您的 UITableViewController 和 tableView 的 XIB 中创建一个与我的 tableView 大小相同的 UIView。

  2. 将带有我的占位符图像的 ImageView 集添加到 UIView。

  3. 将 UIView 连接为 IBOutlet(在下面的示例代码中,我将其称为 emptyTableView)

  4. 何时从 UITableViewController 子类中显示占位符:

    [self.tableView addSubView:emptyTableView]; [self.tableView setScrollEnabled:FALSE];

禁用滚动是必要的,否则用户将能够上下移动占位符图像。只要记住在用户添加项目后启用它。

  1. 删除图像视图

    [emptyTableView removeFromSuperview];

于 2010-01-04T02:48:49.503 回答
1

为此,我使用以下控制器而不是UITableViewController. 它会在表格为空时自动在表格上放置一个视图,并在表格填满时将其删除。

只需调用[self reloadData]而不是,[self.tableView reloadData]以便它可以检查表是否为空。

在您的子类中,实现一个makeEmptyOverlayView函数,该函数将创建视图以显示在一个空表上。

@interface MyTableViewController : UITableViewController
{
      BOOL hasAppeared;
      BOOL scrollWasEnabled;
      UIView *emptyOverlay;
}

- (void) reloadData;
- (void) checkEmpty;

@end

@implementation MyTableViewController

- (void)viewWillAppear:(BOOL)animated
{
   [self reloadData];
   [super viewWillAppear: animated];
}

- (void)viewDidAppear:(BOOL)animated
{
   hasAppeared = YES;

   [super viewDidAppear: animated];

   [self checkEmpty];
}

- (void)viewDidUnload
{
   if (emptyOverlay)
   {
      self.tableView.scrollEnabled = scrollWasEnabled;
      [emptyOverlay removeFromSuperview];
      emptyOverlay = nil;
   }
}

- (void) reloadData
{
   [self.tableView reloadData];

   if (hasAppeared &&
       [self respondsToSelector: @selector(makeEmptyOverlayView)])
      [self checkEmpty];
}

- (void) checkEmpty
{
   BOOL isEmpty(YES);

   id<UITableViewDataSource> src(self.tableView.dataSource);
   NSInteger sections(1);
   if ([src respondsToSelector: @selector(numberOfSectionsInTableView:)])
      sections = [src numberOfSectionsInTableView: self.tableView];
   for (int i(0); i<sections; ++i)
   {
      NSInteger rows([src tableView: self.tableView numberOfRowsInSection: i]);
      if (rows)
         isEmpty = NO;
   }

   if (!isEmpty != !emptyOverlay)
   {
      if (isEmpty)
      {
         scrollWasEnabled = self.tableView.scrollEnabled;
         self.tableView.scrollEnabled = NO;
         emptyOverlay = [self makeEmptyOverlayView];
         [self.tableView addSubview: emptyOverlay];
         [emptyOverlay release];
      }
      else
      {
         self.tableView.scrollEnabled = scrollWasEnabled;
         [emptyOverlay removeFromSuperview];
         emptyOverlay = nil;
      }
   }
   else if (isEmpty)
   {
      // Make sure it is still above all siblings.
      [emptyOverlay retain];
      [emptyOverlay removeFromSuperview];
      [self.tableView addSubview: emptyOverlay];
      [emptyOverlay release];
   }
}

@end
于 2011-02-08T19:30:49.067 回答
0

如果您使用Three20,您可以在填充表格之前轻松地将任何您想要的图像设置为占位符。

于 2009-05-18T23:52:24.443 回答
0

所以,为了解决这个问题,我按照上面评论中的讨论做了:

我创建了一个普通的 UIViewController 子类,其中包含一个 UIImageView 和一个 UITableView。viewController 符合 UITableViewDelegate 和 UITableViewDatasource 协议,负责管理 tableView。viewController 类只是根据数据是否可用来显示或隐藏 imageView。

我之前尝试使用 UITableViewController 管理这两个视图时出错了。UITableViewController 必须有一个 tableView 作为它的视图,而在这个解决方案中,一个 viewController 可以包含图像和 tableView,并实现必要的协议来管理 tableView。

感谢所有的帮助!

于 2009-05-21T12:09:05.537 回答