2011-12-15 10 views
0

私は現在、Messages.appのように動作するアプリケーションを開発しています。 MasterViewControllerは、連絡先の名前、時刻、最新のメッセージのスニペットのテーブルをロードするメインビューです。特定のセルをタップするとDetailViewControllerに移動し、連絡先に送信したメッセージを最新の完全なメッセージでロードします。戻るボタンを押すと、MasterViewControllerに戻ります。 rightBarButtonItemをタップすると、ユーザーが特定の連絡先へのメッセージを作成できるComposeViewController(モーダル)が開きます。このアプリとデフォルトのMessages.appとの違いは、メッセージを送信する前に遅延タイマーがあることです。 ComposeViewControllerには、メッセージを入力するテキストフィールド、連絡先を選択するボタン、時間遅延を選択するボタン、送信するボタン、タイマーをキャンセルするボタン、およびModalViewControllerを閉じるボタンがあります。カスタムtableviewcellsでテーブルビューにオブジェクトを追加したり削除したりするにはどうすればいいですか?

実際のSMSメッセージを完全に送信する機能を削除しました。私はちょうどメッセージを送ったと彼/彼女は新しいものを作成したい場合、彼/彼女に伝えるアラートビューをユーザーに提示しました。 Cancelを押すと、ModalViewControllerが終了し、MasterViewControllerに戻ります。

問題は、テーブルに行を表示させることはできず、テーブル内のセルを追加したり削除したりすることもできません。ここで

は私MasterViewControllerののviewDidLoad内のいくつかのコードです:

[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 

// Delete button to delete messages 
UIBarButtonItem *deleteBarButtonItem = [[UIBarButtonItem alloc] 
             initWithBarButtonSystemItem:UIBarButtonSystemItemTrash 
             target:self 
             action:@selector(deleteText)]; 
self.navigationItem.leftBarButtonItem = deleteBarButtonItem; 


// Compose button to go to compose messages 
UIBarButtonItem *composeBarButtonItem = [[UIBarButtonItem alloc] 
             initWithBarButtonSystemItem:UIBarButtonSystemItemCompose 
             target:self 
             action:@selector(composeText)]; 
self.navigationItem.rightBarButtonItem = composeBarButtonItem; 

[deleteBarButtonItem release]; 
[composeBarButtonItem release]; 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *message = [defaults objectForKey:kMessageText]; 
NSString *contactname = [defaults objectForKey:kContactNameText]; 
NSString *timestamp = [defaults objectForKey:kTimeStampText]; 

[messageDetails initWithObjectsAndKeys:contactname, kContactNameKey, message, kContactMsgKey, timestamp, kContactTimeKey, nil]; 

NSMutableArray *messageInfo = [[NSMutableArray alloc] initWithObjects:messageDetails, nil]; 

self.messagesList = messageInfo; 

[messageInfo release]; 

[super viewDidLoad]; 

はここでcellForRowAtIndexPathのコードです:

CustomCellViewController *customCell = (CustomCellViewController *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellViewController"]; 

if (customCell == nil) 
{ 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCellViewController" 
               owner:self 
               options:nil]; 
    for (id oneObject in nib) if ([oneObject isKindOfClass:[CustomCellViewController class]]) 
     customCell = (CustomCellViewController *)oneObject; 
} 

NSUInteger row = [indexPath row]; 
NSDictionary *messages = [self.messagesList objectAtIndex:row]; 

customCell.nameLabel.text = [messages objectForKey:kContactNameKey]; 
customCell.nameLabel.textColor = [UIColor whiteColor]; 
customCell.messageLabel.text = [messages objectForKey:kContactMsgKey]; 
customCell.messageLabel.textColor = [UIColor lightGrayColor]; 
customCell.timeLabel.text = [messages objectForKey:kContactTimeKey]; 
customCell.timeLabel.textColor = [UIColor blueColor]; 

customCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

return customCell; 

は、ここでセルを削除するためのコードです:

- (void)tableView:(UITableView *)tableView commitEditingStyle(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
    // Delete the row from the data source.   
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationFade]; 

    [messagesList removeObjectAtIndex:indexPath.row]; 
    [self.tableView reloadData]; 
    } 
    else if (editingStyle == UITableViewCellEditingStyleInsert) { 
    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. 
    } 
} 
+0

最後のコードはどこですか?マスタービューコントローラの新しいインスタンスが作成され、現在のマスターテーブルでは動作していません。 – jrturton

+0

これは、テキストフィールドにテキストを配置し、モーダルビューコントローラを閉じるボタンをタップするモーダルビューコントローラの実装にあります。 – jaytrixz

答えて

0

あなたの最終的なコードスニペットマスタービューコントローラの新しいインスタンスを作成する場所は、 eの問題。

これはあなたが探しているビューコントローラではありません。通常、このような状況で使用されている

MasterViewController *master = (MasterViewController*)self.parentViewController; 

他のデザインパターン:

  • あなたはモーダル詳細ビューコントローラを発表しましたので、あなたは、詳細コントローラのparentViewControllerプロパティを介してマスタコントローラにアクセスすることができますマスタコントローラに新しいオブジェクトを作成し、テーブルに行を挿入してから、新しいオブジェクトを更新用の詳細コントローラに渡します。
  • マスタコントローラが準拠する詳細コントローラ用のデリゲートプロトコルを作成します。

詳細コントローラはマスターコントローラーについて必要以上に知っていることを除いてすべての実際的な目的のためにほとんど何をしていますか(つまり、インポート中ですマスター.hファイル全体がプロトコルに準拠していることを知るよりも)。

データ構造に関しては、ここでは複数の行があるとは思いません。ユーザーのデフォルトに1つのメッセージを格納し、そのメッセージで配列を作成します。私はあなたが最後にこれを格納するデフォルトを使用するつもりはないが、私は、辞書の配列が単一のキーの下にデフォルトで格納されていることを期待し、各辞書はテーブルの行を表し、あなたのメッセージ、連絡先の名前のキーなどに対して辞書に文字列として格納されます。

変更可能な配列を返すので、変更可能な配列をデフォルトから返さなければなりません。

あなたのcellForRow ...メソッドでは、配列から適切な辞書を取得し、そこからセルを移入します。

新しい行を追加するときは、新しいディクショナリを作成して詳細コントローラに渡します。

行を削除すると、関連する辞書がアレイから削除されます。

+0

ありがとうjrturton!私はあなたの提案を試みます。 – jaytrixz

+0

それが動作するまで答えを受け入れないでください;) – jrturton

+0

それを得ました。自分のコードを編集するときに何か気づいた。セルを追加するときは、ディテールビューコントローラとマスタービューコントローラの両方に対して、1つの可変配列と1つの可変ディクショナリを作成する必要があります。データは、モーダルビューコントローラ内のテキストフィールドから取得されます。私はすでに自分のコードを更新しました。時間があれば、http://dl.dropbox.com/u/7539490/texText.zipで見ることができます。エラーはありませんが、値はテーブルに表示されません。 :( – jaytrixz

関連する問題