0

だからこれはここでの私の質問に基づいています

NSArrayの代わりにNSDictionaryを使用する場合のObjectiveC

noobの質問についてお詫びします。私はObjectiveCを学び始めたばかりで、本当に混乱しています。

- (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. これを最初のセクションでは制限したいが、2番目のセクションでは制限したくない

    -(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 = [menuItem objectForKey:@ "Events"];

だから私がしたかったのは:

  • セクションヘッダー1
    1. H1コンテンツ1
    2. H1コンテンツ2
  • セクションヘッダー1
    1. H2コンテンツ1
    2. H2コンテンツ2
    3. H1コンテンツ3
4

2 に答える 2

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];
于 2013-01-24T14:51:03.060 に答える
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(またはデータの初期化/割り当てを決定した場所)でこれを行います。

-(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;

}

YMMV、ハッピーコーディング

于 2013-01-24T17:45:17.737 に答える