iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   AdvancedTableViewCells (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/51796-advancedtableviewcells.html)

Alwinkov 11-01-10 13:16

AdvancedTableViewCells
 
Beste Devs

Ik ben bezig met de sample code van Apple AdvancedTableViewCells. Ik heb het design aangepast en heb meer duidelijkheid gekregen hoe de vormgeving is opgebouwd. Dat gaat allemaal naar wens.

Wat mij niet lukt is om te zorgen dat als je op de eerste knop drukt dat hij naar een andere TableView gaat.

Misschien dat iemand zo vriendelijk wilt zijn om te vertellen welke stappen ik moet doen aan de hand van de sample code. Wat moet ik allemaal veranderen? Data.plist, Nieuwe ViewController toevoegen ect...

Ik heb een aantal video's en tutorials geprobeerd maar ik krijg het niet voor elkaar om AdvancedTableViewCells te ''updaten''

AdvancedTableViewCells

Frog 11-01-10 17:09

In RootViewController.m zie je de volgende code staan:
Code:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

Dit wordt aangeroepen wanneer je een rij in de UITableView selecteerd.
indexPath is de sectie en de rij.

Je moet hier dan dus zoiets neerzetten:
Code:

if ([[indexPATH] indexPath] == 1) {
Laat nieuwe view zien
}


Alwinkov 11-01-10 18:03

@Frog , ik krijg de volgende foutmelding: Expected identifier or '(before 'if'


http://alwinkov.com/app_code.png

Frog 11-01-10 21:51

Probeer de volgende code maar eens: ;)

Code:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        if ([indexPath row] == 0) {
                DOE IETS
        } else if ([indexPath row] == 1) {
                DOE IETS
        }
}


Alwinkov 11-01-10 23:37

Hij geeft geen foutmelding en geen crash. Als ik op de eerste of de twee knop klik dan gaat hij niet naar een andere view. Ik had voor de zekerheid even een nieuwe TestViewController aangemaakt..maar werkt nog niet...:o

Frog 12-01-10 17:43

Oh, ik dacht dat je dat al wist. Het klopt inderdaad dat dit niets doet, met deze code weet je alleen wanneer er op een TableViewRow wordt gedrukt, maar je doet niets. Die code moet staan op de plaats waar "DOE IETS" staat. Je kan het op twee manieren doen:
1. AddSub: voeg een subview van de huidige view toe. Dit kan, maar werkt niet met de UINavigationController samen en is met een TableView meestal een mindere methode.
2. Zeg tegen de UINavigationController dat hij een nieuwe view moet openen. Dat doe je door op de plaats van "DOE IETS" de volgende code te zetten:
Code:

[self.navigationController pushToViewController:yourView animated:YES];
Op de plaats van yourView zet je dan de view neer die je dan moet zien. Je hebt geen UIViewController nodig, alleen een UIView waar je een IBOutlet aan hebt gekoppeld.

Alwinkov 12-01-10 20:53

Citaat:

Op de plaats van yourView zet je dan de view neer die je dan moet zien. Je hebt geen UIViewController nodig, alleen een UIView waar je een IBOutlet aan hebt gekoppeld.
Zou je dat nog wat uitgebreider willen uitleggen welke stappen ik moet doen om een view te maken zodat hij werkt. Want ik geen IBOutlet toevoegen...het volgende screen zoals het hoort volgens krijg ik niet. Ik zie geen Class Outlets venster.

Zo hoort het volgens mij...maar bij mij staat geen IBOutlet.
http://icodeblog.com/wp-content/uplo...10setclass.png

Frog 12-01-10 21:48

Je voegt in interface builder een UIView toe en je voegt in het .h bestand van je RootViewController onder @interface de volgende regel toe: "IBOutlet UIView *yourView;". Dan koppel je in interface builder de outlet aan je view (2e tab). Je hebt dan een outlet gemaakt en je kan daaraan refereren door gewoon de naam van die outlet (in dit geval yourView) in te typen.

Alwinkov 13-01-10 15:10

Ik heb de view yourView laten staan zodat als het werkt. Dat ik dan gewoon alles gemakkelijk kan aanpassen. Zodra ik op de eerste of tweede knop druk dan krijg ik een crash... Heb even alles online gezet, ik denk zelf dat ik ergens een foutje maak in IB...:)

RootViewController.h
Code:

#import <UIKit/UIKit.h>
#import "ApplicationCell.h"

@interface RootViewController : UITableViewController {
        IBOutlet UIView *yourView;
       
        ApplicationCell *tmpCell;
    NSArray *data;
}

@property (nonatomic, assign) IBOutlet ApplicationCell *tmpCell;
@property (nonatomic, retain) NSArray *data;



@end

RootViewController.m
Code:

#import "RootViewController.h"
#import "CompositeSubviewBasedApplicationCell.h"
#import "HybridSubviewBasedApplicationCell.h"


// Define one of the following macros to 1 to control which type of cell will be used.
#define USE_INDIVIDUAL_SUBVIEWS_CELL    1
#define USE_COMPOSITE_SUBVIEW_CELL      0
#define USE_HYBRID_CELL                0


/*
 Predefined colors to alternate the background color of each cell row by row (see tableView:cellForRowAtIndexPath: and tableView:willDisplayCell:forRowAtIndexPath:).
 */
#define DARK_BACKGROUND  [UIColor colorWithRed:151.0/255.0 green:152.0/255.0 blue:155.0/255.0 alpha:1.0]
#define LIGHT_BACKGROUND [UIColor colorWithRed:172.0/255.0 green:173.0/255.0 blue:175.0/255.0 alpha:1.0]


@implementation RootViewController

@synthesize tmpCell, data;


#pragma mark View controller methods

- (void)viewDidLoad
{
    [super viewDidLoad];

        // Configure the table view.
    self.tableView.rowHeight = 73.0;
    self.tableView.backgroundColor = DARK_BACKGROUND;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
   
        // Load the data.
    NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
    self.data = [NSArray arrayWithContentsOfFile:dataPath];
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    switch (toInterfaceOrientation) {
        case UIInterfaceOrientationPortrait:
        case UIInterfaceOrientationLandscapeLeft:
        case UIInterfaceOrientationLandscapeRight:
            return YES;
        default:
            return NO;
    }
}



#pragma mark Table view methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [data count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ApplicationCell";
   
    ApplicationCell *cell = (ApplicationCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
       
    if (cell == nil) {
               
#if USE_INDIVIDUAL_SUBVIEWS_CELL
        [[NSBundle mainBundle] loadNibNamed:@"IndividualSubviewsBasedApplicationCell" owner:self options:nil];
        cell = tmpCell;
        self.tmpCell = nil;
               
#elif USE_COMPOSITE_SUBVIEW_CELL
        cell = [[[CompositeSubviewBasedApplicationCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ApplicationCell"] autorelease];
               
#elif USE_HYBRID_CELL
        cell = [[[HybridSubviewBasedApplicationCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ApplicationCell"] autorelease];
#endif
    }
   
        // Display dark and light background in alternate rows -- see tableView:willDisplayCell:forRowAtIndexPath:.
    cell.useDarkBackground = (indexPath.row % 2 == 0);

        // Configure the data for the cell.
       
    NSDictionary *dataItem = [data objectAtIndex:indexPath.row];
    cell.icon = [UIImage imageNamed:[dataItem objectForKey:@"Icon"]];
    cell.publisher = [dataItem objectForKey:@"Publisher"];
    cell.name = [dataItem objectForKey:@"Name"];
    cell.numRatings = [[dataItem objectForKey:@"NumRatings"] intValue];
    cell.rating = [[dataItem objectForKey:@"Rating"] floatValue];
    cell.price = [dataItem objectForKey:@"Price"];

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}


- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.backgroundColor = ((ApplicationCell *)cell).useDarkBackground ? DARK_BACKGROUND : LIGHT_BACKGROUND;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        if ([indexPath row] == 0) {
                [self.navigationController pushToViewController:yourView animated:YES];
        } else if ([indexPath row] == 1) {
                [self.navigationController pushToViewController:yourView animated:YES];
        }
}


#pragma mark Memory management

- (void)dealloc
{
    [data release];
    [super dealloc];
}


@en

Met IB in RootViewController.xib een view toegevoegd. Ik heb er even screenshots van gemaakt:

//edit screenshots verwijderd

Frog 13-01-10 16:44

Hoe heb je dat voor elkaar gekregen? In IB builder heb je yourView gekoppeld aan een UITableView, terwijl het een UIView hoort te zijn. Dat kan helemaal niet....

Raar, maar je moet de outlet yourView dus aan de view koppelen en niet aan de UITableView.

Heb je deze code helemaal van een tutorial gekopieerd? Hij is namelijk onnodige dingen in voor jouw doeleinden. Sorry als het niet zo is, maar als je niet begrijpt wat je doet zal je nooit tot een perfecte app komen. Het is beter om de achtergrond van objective-c te.:)

Alwinkov 13-01-10 17:15

Bijde gelinkt in IB. Het is een sample code van Apple. Er zitten een aantal dingen die ik wil gaan gebruiken. Verder ben ik bezig om Object-c te leren. (Heb verschillende tutorials en video trainingen gedaan, vind het alleen lastig om te zorgen dat de punten op de i staan)

Ik heb je even het project gestuurd via PM misschien dat je er even naar wilt kijken. Heb zelf het idee dat ik wat verkeerd heb gelinkt in IB.

Frog 13-01-10 19:45

1 Bijlage(n)
Het werkt nu. Het was deels mijn fout en deels jouw fout. Jij had hem inderdaad verkeerd verbonden in IB, maar ik had 2 typfoutjes gemaakt waardoor hij niet werkte. Als bijlage van deze post heb ik de nieuwe versie en ik heb ook gelijk gezorgd dat een row in een tableview gedeselecteerd wordt.

Alwinkov 13-01-10 20:54

Frog, super bedankt!:d

Nu zie ik wat ik fout had gedaan, bijv View wat View Controller moet zijn in IB...:D

Frog 14-01-10 17:29

Geen probleem! :)

Alwinkov 14-01-10 22:49

:)

Nog een vraag als het kan, dan weet ik genoeg om te zorgen dat mijn app de goede kant op gaat.:d

Het is helemaal gelukt met de verschillende views. Nou heb ik aantal files gekopieerd en de naam veranderd. Als je nu op de eerste TableViewCell (knop 1) klikt, dan is het design gelijk aan de main view.

Nu wil ik graag dat die view zijn informatie uit data1.plist haalt en niet uit data.plist...Nou had ik de code hieronder gekopieerd en aangepast maar werkte niet. Misschien is er een simpele regel om aan onderste code toe te voegen wat ook werkt?

Code:

- (void)viewDidLoad
{
    [super viewDidLoad];

        // Configure the table view.
    self.tableView.rowHeight = 73.0;
    self.tableView.backgroundColor = DARK_BACKGROUND;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
   
        // Load the data.
    NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
    self.data = [NSArray arrayWithContentsOfFile:dataPath];
}


Frog 18-01-10 20:05

Sorry dat ik zo laat reageer, ik had het erg druk. :)

Je moet denk ik in de twee-na-laatste regel Data vervangen door Data1.

Alwinkov 20-01-10 17:24

NP :), ik had al data vervangen door data1 maar zonder succes...

Frog 20-01-10 18:05

Weet je dat het hoofdlettergevoelig is en dat je bestand dus Data1 moet heten als je Data1 neerzet en niet data1. Ook moet je er natuurlijk .plist achterhebben.

Alwinkov 20-01-10 20:12

Dat weet ik :) Denk dat ik NSBundle mainBundle moet veranderen?

Code:

- (void)viewDidLoad
{
    [super viewDidLoad];

        // Configure the table view.
    self.tableView.rowHeight = 73.0;
    self.tableView.backgroundColor = DARK_BACKGROUND;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
   
        // Load the data.
    NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
    self.data = [NSArray arrayWithContentsOfFile:dataPath];
       
        NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"Data1" ofType:@"plist"];
    self.data = [NSArray arrayWithContentsOfFile:dataPath];
}


Frog 20-01-10 22:04

Nee, dat zegt alleen dat het in je bundle zit. Je zet nu 2x self.data, je moet
een nieuwe global variable data maken en daarna in een ander stuk code die variabele ook gebruiken.

Is het trouwens niet beter om i.p.v. een nieuwe property list de data in de oude erbij te zetten.


Alle tijden zijn GMT +2. Het is nu 22:07.