1

ロード時に、ユーザーのデータを含む UITableView を表示するアプリケーションがあります。

ただし、ユーザーが最初にアプリケーションをロードしたとき (データを作成する前)、空のテーブルの代わりに背景画像を表示したいと思います (「レコードの追加」ナビゲーションバーボタンを指す矢印付き)。 . ユーザーが最初のレコードを追加すると、代わりにテーブルビューが表示されます。私は多くのアプリがこれを行うのを見てきました - 現時点で私が考えることができる唯一の例は、予算などを設定する前の Cha-Ching です。しかし、私は一生、これを行う方法を考え出すことはできません。

最初にメイン ウィンドウの xib にナビゲーション コントローラーを追加しました。その rootViewController はカスタム ビューコントローラー/xib でした。この rootViewController には、その上に非表示の tableview がある背景画像と、tableview を管理するカスタム tableviewcontroller が含まれていました。これは問題なく機能しているようで、データがあればロードしてテーブルに表示します。ただし、データを画面外にスクロールすると、アプリがクラッシュし、次のエラーが発生します。

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

UITextEffectsWindow が何であるか、またはテーブルビューを管理しようとした理由がわかりません。ビュー階層で何かが正しく接続されていない可能性があると思います...

これを行うためのはるかに単純で簡単な方法があれば、誰かがそれを説明できれば非常に感謝しています. これをどのように行いますか?

前もって感謝します。

4

5 に答える 5

1

これまでのところ、私が満足している 1 つのソリューションを次に示します。

まず、TableView と同じサイズの透明なビューを作成しました。TableView のデータ ソースにデータがない場合は常に、このビューを TableView の兄弟として追加します。透明度が TableView のスクロール アニメーションの滑らかさに影響を与える可能性があるため、データが利用可能な場合はビューを完全に削除します。

このビューに透明なラベルを追加しただけで、「利用可能なデータがありません」という効果があります。このラベルに少しシャドウイングを追加すると、ラベルが空の 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

したがって、これを解決するために、上記のコメントで説明したように実行しました。

UIImageViewとUITableViewを含む通常のUIViewControllerサブクラスを作成しました。viewControllerは、UITableViewDelegateおよびUITableViewDatasourceプロトコルに準拠し、tableViewを管理します。viewControllerクラスは、データが使用可能かどうかに応じて、imageViewを表示または非表示にします。

私は以前、UITableViewControllerを使用してこれらの両方のビューを管理しようとして間違っていました。UITableViewControllerは、ビューとしてtableViewを持っている必要がありますが、このソリューションでは、viewControllerに画像とtableViewの両方を含めることができ、tableViewを管理するために必要なプロトコルを実装できます。

すべての助けをありがとう!

于 2009-05-21T12:09:05.537 に答える