Programmgesteuertes Erstellen einer TableVIew mit Objective-C iOS

Ich bin neu in der Entwicklung von iOS-Anwendungen und Objective C selbst, daher habe ich wahrscheinlich eine sehr einfache Frage.

Derzeit habe ich die folgende Methode, die über einen ToolBar-Button-Klick aufgerufen wird. Mit dieser Methode wird eine Tabellenansicht in der Frame-Variablen erstelltfr.

<code>- (IBAction)addGolfer:(id)sender {
    CGRect fr = CGRectMake(101, 45, 100, 416);

    UITableView *tabrleView = [[UITableView alloc]
      initWithFrame:fr
      style:UITableViewStylePlain];

    tabrleView.autoresizingMask =
      UIViewAutoresizingFlexibleHeight |
      UIViewAutoresizingFlexibleWidth;
    tabrleView.delegate = self;
    tabrleView.dataSource = self;
    [tabrleView reloadData];

    self.view = tableView;
}
</code>

Das Ergebnis des Aufrufs dieser Methode ist nicht das, was ich erwarte. Anstatt die Tabellenansicht im Frame "fr" zu erstellen, füllt die Tabellenansicht den gesamten Bildschirm aus.

Auch hier bin ich total neu und würde mich über jegliche Antworten und Anregungen freuen. Vielen Dank!

Antworten auf die Frage(3)

Lösung für das Problem

Wenn Sie einstellendataSource unddelegate Eigenschaften für IhreUITableViewDas heißt, Sie müssen mindestens diese Methoden für schreibendataSource:

<code>- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
</code>

Wenn Sie dies nicht tun, wird es abstürzen. Zusammenfassung erhalten Sie diese (Dieser Code kann Syntax- oder Logikfehler enthalten - Ich habe es im Notizblock geschrieben):

<code>@interface YourViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
    UITableView *firstTableView;
    UITableView *secondTableView;
}

@end
</code>

//

<code>@implementation YourViewController

#pragma mark - Objects Processing

- (void)addGolfer:(UIBarButtonItem *)sender {
    if (secondTableView) {
        [secondTableView removeFromSuperView];
        secondTableView = nil;
    }

    secondTableView = [[UITableView alloc] initWithFrame:CGRectMake(101, 45, 100, 416)];
    secondTableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    secondTableView.delegate = self;
    tabrleView.dataSource = self;

    [self.view addSubview:secondTableView];
}

#pragma mark - TableView DataSource Implementation

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == firstTableView) { // your tableView you had before
        return 20; // or other number, that you want
    }
    else if (tableView == secondTableView) {
        return 15; // or other number, that you want
    }
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

    cell.backgroundView = [[UIView alloc] init];
    [cell.backgroundView setBackgroundColor:[UIColor clearColor]];
    [[[cell contentView] subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];

    if (tableView == firstTableView) { // your tableView you had before
        // ...
    }
    else if (tableView == secondTableView) {
        cell.titleLabel.text = [NSString stringWithFormat:@"Cell %d", indexPath.row + 1];
    }

    return cell;
}

@end
</code>

UIViewController, fügen Sie die tableView als Unteransicht hinzu.

Anstatt:

<code>self.view = tableView;
</code>

Mach das:

<code>[self.view addSubview:tableView];
</code>

Dadurch wird der von Ihnen festgelegte Rahmen korrekt berücksichtigt.

 The Man04. Apr. 2012, 02:04
*** Durchsetzungsfehler in - [UITableView _createPreparedCellForGlobalRow: withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:6061 2012-04-03 20: 02: 44.415 Dot Golf Scoring [728: f803] *** Beenden der App aufgrund einer nicht erfassten Ausnahme "NSInternalInconsistencyException", Grund: "UITableView dataSource muss eine Zelle aus tableView zurückgeben: cellForRowAtIndexPath:"
 DHamrick04. Apr. 2012, 01:55
Könnte sein, dass Sie falsch geschrieben habentabrleView. Es sollte seintableView überall.
 The Man04. Apr. 2012, 01:57
Ja, das habe ich gemacht, weil ich eine andere TableView hatte
 The Man04. Apr. 2012, 02:03
Ich habe getan, was ihr beide gesagt habt, und ich verstehe ...
 danh04. Apr. 2012, 02:00
@ DHamrick ist richtig. Entfernen Sie alle Zeilen, die Sie der Ansicht zuweisen. Führen Sie für jede Tabelle, die Sie verwenden, unabhängig von der Schreibweise [self.view addSubview: ...] aus. Möglicherweise stolpern Sie auch über die Autoresizing-Maske. Lassen Sie es zuerst funktionieren, indem Sie es auskommentieren.
 The Man04. Apr. 2012, 01:45
Ich habe das getan, aber jetzt passiert nichts. --- Entschuldigung, ich erhalte jetzt eine Fehlermeldung.

Schritt 1: Delegat hinzufügenUITableViewDataSource,UITableViewDelegate

<code>UITableViewDataSource,UITableViewDelegate>
{
   UITableView *tableView;
}
</code>

Schritt 2:

<code>-(void)viewDidLoad
{
    tableView=[[UITableView alloc]init];
    tableView.frame = CGRectMake(10,30,320,400);
    tableView.dataSource=self;
    tableView.delegate=self;
    tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    [tableView reloadData];
    [self.view addSubview:tableView];
}
</code>

Schritt 3: Eigenschaften für die Tabellenansicht (Zeilen & Spalten)

// - Für keine Zeilen in der Tabelle

<code>- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
   return 10;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
</code>

// - Tabellenkopfhöhe, falls erforderlich

<code>- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
   return 50;
}
</code>

// - Zuweisen von Daten zu Zellen

<code>- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   static NSString *CellIdentifier = @"Cell";
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier   forIndexPath:indexPath] ;

   if (cell == nil)
   {
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
   }
   cell.textLabel.text=[your_array objectAtIndex:indexPath.row]; ***(or)*** cell.textLabel.text = @"Hello";
   return cell;
}
</code>

// - Bedienung beim Berühren von Zellen

<code>-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   // Your custom operation
}
</code>

Ihre Antwort auf die Frage