7

tableview-look-a-like-loginをアプリに追加したいのですが、実装はそれほど簡単ではないようです。複数のアプローチを使用して目標を達成しようとしましたが、どのソリューションが最適かわかりません。

たとえば、DropboxとFacebookにはこのようなログインページがあります。

これが私の3つのアプローチです:

  1. ビューに2つのUITextfield(境界線なし)を追加し、を配置しました。後ろのpng、これはテーブルビューセルのように見えます。(実際のテーブルビューを使用したいので、最善のアプローチではありません)

  2. ViewControllerにコンテナビューを追加し、静的なテーブルビューを内部に持つテーブルビューを配置しました。ここでの問題は、ビューコントローラ内の情報にアクセスする方法がわからないことです。

  3. ViewControllerにテーブルビューを追加し、動的セルを使用しました。デリゲートとデータソースのアウトレットをビューコントローラーに接続し、デリゲートメソッドとデータソースメソッドで初期化しました。ここでの問題は、uiviewcontroller内で静的テーブルビューを使用できないことです。

この問題を解決するためのより良い方法はありますか?これをもっとエレガントな方法で行う方法を本当に知りたいです。

編集

ContainerViewControllerは、基本的に数か月前にこの問題を解決しました。1つをメインコントローラーに埋め込んだ後、関数を介してそれにアクセスしprepareForSegue、その特定のコントローラーが埋め込まれたコントローラーと対話するためのプロトコルベースのインターフェイスを定義できます。

4

6 に答える 6

3

通常の内部で静的セルを使用する場合はUIViewController、静的セルを追加し、Interface Builderで好きなように設計してから、テーブルセルを強力なIBアウトレットとして接続します(弱い機能はありません。強く参照されていることを確認してください)。 。テーブルセルがいくつかある場合、これは問題なく機能します。次に、View Controllerをタブレットビューのデータソースとして設定し、-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionセルの数を返すように実装-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathし、指定されたインデックスパスに対して強く参照されるセルインスタンスを返すように実装します。このメソッドを、4つのセルを持つView Controllerの単純なテーブルビューに使用しましたが、完全に機能しています。大規模な動的データセットの場合、このアプローチは絶対にお勧めしませんが、小さい静的テーブルの場合は、これで正しく機能します。

于 2013-09-25T11:43:11.677 に答える
2

私はこれを解決する方法を考えています。私はそれがそうするためのきれいな方法だと思います。このコントローラーにはストーリーボードは必要ありません。

コントローラのサブクラスUITableViewControllerを次のようにします。

@interface YourViewController : UITableViewController

次に、viewDidLoadで、セルのインスタンスを作成します。

- (void) viewDidLoad {
    usernameCell = [YourTextFieldCell new];
    passwordCell = [YourTextFieldCell new];
}

もちろん、これYourTextFieldCellはUITableViewCellの独自のサブクラスであり、次のようになります。

@implementation YourTextFieldCell {
    UITextField textField;
}
- (id) init {
    self = [super init];
    if (self) {
        // Adjust the text's frame field to your liking
        textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 200, 20)];
        [self addSubview:textField];
    }
}
// A getter method to access the textfield from the outside
- (UITextField *) textField {
    return textField;
}

@end

戻るYourViewController

- (NSInteger) tableView:(UITableView *) tv numberOfRowsInSection:(NSInteger) section {
    return 2;
}
- (UITableViewCell *) tableView:(UITableView *) tv cellForRowAtIndexPath:(NSIndexPath *) indexPath {
    if (indexPath.row == 0) {
        return usernameCell;
    } else if (indexPath.row == 1) {
        return passwordCell;
    }
    return nil;
}

私がこれでどこに行くのかわかりますか?これがあなたがやるべきだと私が思う方法です!幸運を!

于 2012-12-12T19:46:40.247 に答える
1

オプション2)を使用して、ストーリーボードを使用し、静的セルを持つUITableViewControllerの独自のサブクラスを含むContainerViewがある場合prepareForSegue:は、親ViewControllerにメソッドを実装して、UITableViewControllerへの参照を取得できます(これは、 segue)また、必要に応じてUITableViewControllerサブクラスに自分自身を渡します(弱い参照で保持する必要があります)。

于 2012-12-12T22:13:10.370 に答える
1

免責事項-この回答はどのサイズでも機能しUITableViewますが、ログインビューを作成するだけの場合は、トムの回答が非常にうまく機能します。

これが役立つかどうかはわかりませんが、これに対して私が行ったのは、-esqueサブクラスを使用して独自のUITableView-esqueサブクラスを作成することUITableViewCellでした。

これはあなたが聞きたいことではないかもしれませんが、私はこれを何度も使用しているので、私が作ったものが本当に役立つと思います。基本的に、さまざまなタイプ(10.0f〜20.0fcornerRadiusおよび1pxの境界線(UIScreen網膜のスケールプロパティで除算)のスタイルアプローチを備えたUIViewがあります。セルについては、フルサイズUIButtonで表示する必要があります。デリゲートを使用するか、テーブルビューのクラス内にターゲットとタグを設定することにより、タッチイベントのテーブルビューに応答します。

UITableView最後に、特定のテーブルを作成するための情報と同じようなデリゲートシステムがあります。

要するに、あなたは必要になるでしょう:

  • 2つUIViewのサブクラス(TableViewおよびTableViewCell)
  • 2デリゲート/プロトコル(TableViewDataSourceおよびTableViewDelegate)

オプションで

  • 1デリゲート(TableViewCellResponseDelegate)
  • 1NSObjectサブクラス(各セルに必要なすべての情報が含まれています-使いやすさ)
于 2012-12-12T19:43:19.373 に答える
1

あなたのアプローチ2が最善だと思います。テーブルビューコントローラーの情報にアクセスする必要がある場合は、UIViewController(親ビューコントローラーになります)から、self.childViewControllers.lastObjectを使用してそのテーブルビューコントローラーへの参照を取得できます。UIViewControllerサブクラスのviewDidLoadメソッドでは、必要に応じて、次の行を使用してテーブルビューのデリゲートとして自分自身を設定できます。

[[(UITableViewController *)self.childViewControllers.lastObject tableView] setDelegate:self];

そうすれば、ビューコントローラにtableView:didSelectRowAtIndexPath:メソッドを実装できます。これにより、必要と思われる情報が取得されます。

于 2012-12-12T21:28:57.443 に答える
0

Canのソリューションが最良/最も簡単であることがわかりましたが、残念ながらXCode5.1では機能しません-

同じ基本的な考え方に基づいた回避策を見つけましたが、残念ながらもう少し関与する必要があります:http: //www.codebestowed.com/ios-static-tableview-in-uiviewcontroller/

要約すると、TableViewCellsをビューに直接追加する(およびそれらからIBOutletsを作成するなど)ことができますが、それらをTableViewに適切に「移動」するには、コードでビューから削除する必要があります。 IBで自動レイアウト制約を設定します。

于 2014-03-15T10:26:02.047 に答える