2013-01-24 50 views
0

劃分所以這是基於了我的問題在這裏目標C動態的NSDictionary的UI表視圖通過節頭

objective c when to use NSDictionary instead of NSArray

道歉的菜鳥問題。我剛開始學習目標c,而且我很困惑。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    headers = [NSArray arrayWithObjects:@"Header Section 1 (H1)", @"Header Section 2 (H2)", nil]; 
    events = [NSArray arrayWithObjects:@"H1 Content 1", @"H1 Content 2", nil]; 
    myInfo = [NSArray arrayWithObjects:@"H2 Content 1", @"H2 Content 2", @"H2 Content 3", nil]; 

    menuDetails = [[NSMutableDictionary alloc] init]; 
    for(NSString *event in events){ 
     [menuDetails setValue:event forKey:@"Header Section 1 (H1)"]; 
    } 

    for(NSString *info in myInfo){ 
     [menuDetails setValue:info forKey:@"Header Section 1 (H2)"]; 
    } 
} 


-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 
    return [[menuDetails allKeys] count]; 
} 

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ 
    return [[[menuDetails allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]objectAtIndex:section]; 
} 
  1. 想限制本作的第一部,但沒有在第二段

    -(NSInteger)tableView:(UITableView *)tableview numberOfRowsInSection:(NSInteger)section { 
        return 5; 
    } 
    
  2. 所以,我真的不知道如何使這個充滿活力的,當我試圖填補用這種方法的細胞。我真的不知道如何確保它選擇的部分特定小區是在(阻塞線)的「關鍵」:


-(UITableViewCell *)tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *) indexPath { 
    static NSString *CellIdentifier = @"OptionCellIdentifier"; 

     MenuOptionTableCell *cell = (MenuOptionTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

     if(cell == nil){ 
      NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"OptionCellIdentifier" owner:self options:nil]; 
      cell = [nib objectAtIndex:0]; 
     } 

     NSDictionary *menuItem = [[menuDetails valueForKey:[[[menuDetails allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; 

     cell.optionName.text = [menuItem objectForKey:@"Events"]; 

     return cell; 
    } 

編輯:GAAAHHH,格式化被殺害我。它不會代碼標記內得到

這是IDK做什麼:

cell.optionName.text = [菜單項objectForKey:@ 「活動」];

所以,我想發生的事情是:

  • 節頭1
    1. H1內容1
    2. H1內容2
  • 節頭1
    1. H2內容1
    2. H2含量2
    3. H1內容3

回答

1

我會這樣做,首先創建一個「MyMenuSection」對象如下;

@interface MyMenuSection : NSObject { 
    NSString *title; 
    NSMutableArray *rows; 
} 

@property (nonatomic, retain) NSString *title; 
@property (nonatomic, retain) NSMutableArray *rows; 

@end 

@implementation 

@synthesize title; 
@synthesize rows; 

@dealloc { 
    [title release]; 
    [rows release]; 
    [super dealloc]; 
} 

@end 

然後在您的viewDidLoad(或任何你決定inialize /分配的數據),你可以這樣做;

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSMutableArray menuDetails = [NSMutableArray array]; 

    MyMenuSection section = [[MyMenuSection alloc] init]; 
    section.title = @"Header Section 1 (H1)"; 
    [section.rows addObjects:@"H1 Content 1", @"H1 Content 2", nil]; 
    [menuDetails addObject:section]; 
    [section release]; 

    section = [[MyMenuSection alloc] init]; 
    section.title = @"Header Section 2 (H2)"; 
    [section.rows addObjects:@"H2 Content 1", @"H2 Content 2", @"H2 Content 3", nil]; 
    [menuDetails addObject:section]; 
    [section release]; 

    self.menuDetails = menuDetails; 
    [menuDetails release]; 

} 

然後你的UITableView數據和委託回調看起來像這樣;

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return [menuDetails count]; 
} 


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    if (section == 0) { 
     return 2; 
    } else { 
     return [[(MyMenuSection *)[menuDetails objectAtIndex:indexPath.section] rows] count]; 
    } 
} 

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    return [(MyMenuSection *)[menuDetails objectAtIndex:section] title]; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) indexPath { 

    static NSString *cellIdentifier = @"OptionCellIdentifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if(cell == nil){ 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"OptionCellIdentifier" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 

    cell.optionName.text = (NSString *)[[(MyMenuSection *)[menuDetails objectAtIndex:indexPath.section] rows] objectAtIndex:[indexPath.row]]; 

    return cell; 

} 

因人而異,快樂編碼

+0

快速的問題,你不必擔心numberOfRowsInSection?我想限制第一部分顯示的行數,這就是爲什麼。 – gdubs

+0

哦,我收到「titleForHeaderInSection」錯誤。它會拋出[MainOptionsViewController tableView:numberOfRowsInSection:]:無法識別的選擇發送到實例...... – gdubs

+0

我更新了包含此必需方法的答案。我在這裏返回一個硬的「2」,但將其設置爲任何您可能想要的0行中的行數。 –

1

聽起來你在思考的東西在這裏。我最大的建議是擺脫所有分離的數組,並將它們嵌套在一起。由此我的意思是讓menuItems數組事件和myInfo的NSArray。

這會讓您以後更容易使用.count獲取動態行數。

例如:

events = [NSArray arrayWithObjects:@"H1 Content 1", @"H1 Content 2", nil]; 
myInfo = [NSArray arrayWithObjects:@"H2 Content 1", @"H2 Content 2", @"H2 Content 3", nil]; 

NSArray *menuItems = [NSArray arrayWithObjects:events, myInfo, nil]; 

現在當你調用數組中

-(NSInteger)tableView:(UITableView *)tableview numberOfRowsInSection:(NSInteger)section{ 
    NSArray *tempArray = [NSArray objectAtIndex: section]; 
    return tempArray.count; 
} 

至於以後拉動單元名稱。

cell.optionName.text = [[menuItem objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 
+0

所以我在哪裏設置了部分頭名? – gdubs

+0

你可以有一個單獨的數組,或者你可以將menuItems數組轉換成字典。使用上面顯示的對象和部分標題的鍵。 – joeByDesign