2017-06-21 5 views
0

昨日私はthis questionを投稿しました。私の問題の構造については、すべてのコードがそこにあります。Objective-c UITableViewサブクラスの中から繋ぐ方法

問題...この時間は

私はOBJ-Cに他の言語から来ているとOOP構造のいくつかは、私は少しうんざり作っている(私はすべての可能な機能を梱包好きではありませんいくつかのように単一のUIViewControllerになります)。私はもともとフルページUITableViewControllerに埋め込みのNavigationControllerを作成しようとしていましたが、このプロジェクトの使用例ではデフォルトのナビゲーションバーを使用できませんでした。だから、私は自分のnavbarに入れて、より簡単なオプションの代わりにUITableView(ほとんどフルスクリーンになるようにサイズ変更)を使用しなければならなかった...(これはすべてこれを使って解決できるとは思っていたが、 )

代わりに私は自分自身のカスタムTasksTableView.hサブクラスを含むプロパティを持つUIViewControllerという普通のレギュラーを持っています。上に掲示したリンクに見られるように、サブクラスはUITableViewです。

実際の問題はそうするすべての関数は、UIViewControllerクラスから来る必要のようですので、私はセグエまたはこのUITableViewの内側からのビューを変更するように見えることができないということです。

私はUITableViewサブクラスのdidSelectRowAtIndexPath方法で手動セグエを呼び出す

しようとしています。 performSegueWithIdentifierが、それはそう罰金のthatsていないこのクラスには存在しないことを私に言って明らかにエラーが発生し

[self performSegueWithIdentifier:@"profile" sender:sender]; 

。明らかにそれは私のUITableViewサブクラスをインスタンス化したUIViewControllerクラスに属しています...

実際には、自分のテーブルビューサブクラス自体のプロパティをレンダリングして保持し、ビューをスタックにプッシュしようとしています。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 

    UIViewController *target = [storyboard instantiateViewControllerWithIdentifier:@"SingleTaskViewController"]; 

    AllTasksViewController *allTasksView = [[AllTasksViewController alloc] init]; 

    if(target) { 
     [target setModalTransitionStyle:UIModalTransitionStyleCoverVertical]; 
     [allTasksView presentViewController:target animated:YES completion:nil]; 
    } 
} 

これは含まれており、このUITableViewをインスタンス化図であるので、それが階層構造であることが必要にもかかわらず...私にエラーWarning: Attempt to present <SingleTaskViewController: 0x7fa15d5359f0> on <AllTasksViewController: 0x7fa15d5363c0> whose view is not in the window hierarchy! を与えます。

UITableViewサブクラスを保持しているUIViewControllerから手動でdidSelectRowAtIndexPathを呼び出してみましたが、やはり同じ種類のものでした。しかし、私はインデックスを渡さなければならなかったので、実際に何が選択されたかを教えてくれるテーブルの代わりにそれを選んでいます。

私は本当にUIViewControllerから別々UITableViewサブクラスを維持し、ビューコントローラへのデリゲートメソッドとプロトコルを持っていないしたい

を欲しいもの。私はロジックを分離した状態に保つことを好むだろう。私が必要とするのは、問題のシングルタスクビューへの切り替えや移行を行い、押されたことについて何らかのデータを送信する方法です。

+0

あなたはIBでセグエを設定している場合にのみperformSegueWithIdentifierを呼び出す必要があります!そして、この呼び出しで自己のUIViewControllerを指し、しかし、そのサブビューのどれも! –

+0

私はそれを試みました、それは 'performSegueWithIdentifier'メソッドが存在しないと言います! – GoreDefex

+0

あなたはUIViewControllerのサブクラスであるクラスでのみ呼び出すことができます –

答えて

1

そこには良いチュートリアルがありますが、基本的な考えは...

  • メイン「のViewController」クラス - テーブルビューが含まれており、テーブルビューのための「マニュアル」
  • 「プロファイル」ビューコントローラにセグエ別々のデータソースとデリゲートクラス
  • カスタムプロトコル/委任します

メインのvcが読み込まれると、データソースクラスとデリゲートクラスのインスタンスが作成され、それらがテーブルビューに割り当てられます。

また、Delegateクラスのカスタムプロトコルに準拠しています。これにより、行がタップされたときに、DelegateクラスがメインVCに「コールバック」することができます。

私は一緒にここで見ることができ、このアプローチを実証する非常に簡単な例を置く:https://github.com/DonMag/OCTableViewExample

+0

あなたのお手伝いをありがとうございます! – GoreDefex

関連する問題