开发者

SegmentedControl to change TableView data

开发者 https://www.devze.com 2023-03-12 08:43 出处:网络
I have a tableview with a segmentedControl in the header, i want the segment control to change the data depending on which segment is clicked, in this case Upcoming/Weekly.

I have a tableview with a segmentedControl in the header, i want the segment control to change the data depending on which segment is clicked, in this case Upcoming/Weekly.

Both data sources come from an XML file on my server, which is the part im having trouble with, as im still new to using NSXMLParser

ive messed around with some code, but to no avail. I know that my segmentAction is being picked up because ive used logs to do so. attached is code and an image of my table, cheers

When i click a segmented control, the tableview doesnt update with the new XML source

:)

SegmentedControl to change TableView data

RootViewController.h

#import <UIKit/UIKit.h>

@class XMLAppDelegate, BookDetailViewController;

@interface RootViewController : UITableViewController 
<UITableViewDelegate> 
{

    XMLAppDelegate *appDelegate;
    BookDetailViewController *bdvController;
    UITableViewCell *eventUpCVCell;

    UILabel *month;
    UILabel *title;
    UILabel *date;
    UISegmentedControl *segmentedControl;

}
@property (nonatomic, retain) IBOutlet UITableViewCell *eventUpCVCell;
@property (nonatomic, retain) IBOutlet UISegmentedControl *segmentedControl;

@property (nonatomic, retain) IBOutlet UILabel *month;
@property (nonatomic, retain) IBOutlet UILabel *title;
@property (nonatomic, retain) IBOutlet UILabel *date;
@end

RootViewController.m

#import "RootViewController.h"
#import "XMLAppDelegate.h"
#import "Book.h"
#import "BookDetailViewController.h"

#define kLabel1Tag 1
#define kLabel2Tag 2
#define kLabel3Tag 3

@implementation RootViewController
@synthesize eventUpCVCell, segmentedControl;
@synthesize month, title, date;
-(void)viewDidLoad
{

    appDelegate = (XMLAppDelegate *)[[UIApplication sharedApplication] delegate];

    self.title = @"Upcoming Events";

    [super viewDidLoad];

    NSURL *urlUpcoming = [[NSURL alloc] initWithString:@"http://www.randomosity.com.au/EventsUpcoming.xml"];
    NSURL *urlWeekly = [[NSURL alloc] initWithString:@"http://www.randomosity.com.au/EventsWeekly.xml"];
}


-(IBAction)segmentedAction:(id)sender
{
XMLAppDelegate *mainDelegate = (XMLAppDelegate *)[[UIApplication sharedApplication] delegate];

    segmentedControl = (UISegmentedControl *)sender;

    if (segmentedControl.selectedSegmentIndex == 0)
    {

        mainDelegate.url = [[NSURL alloc] initWithString:@"http://www.randomosity.com.au/EventsUpcoming.xml"];
        [self.tableView reloadData];
    }
    else if (segmentedCon开发者_如何学编程trol.selectedSegmentIndex == 1)
    {
        NSLog(@"Hello 2");

        mainDelegate.url = [[NSURL alloc] initWithString:@"http://www.randomosity.com.au/EventsWeekly.xml"];
        [self.tableView reloadData];
    }


}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  
{
    return 66;  

}

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


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

etc etc...

XMLAppDelegate.h

#import <UIKit/UIKit.h>

@interface XMLAppDelegate : NSObject <UIApplicationDelegate> {

    UIWindow *window;
    UINavigationController *navigationController;
    NSString *url;
    NSMutableArray *eventDataUp;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain) NSString *url;
@property (nonatomic, retain) NSMutableArray *eventDataUp;

@end

XMLAppDelegate.m

#import "XMLAppDelegate.h"
#import "RootViewController.h"
#import "XMLParser.h"

@implementation XMLAppDelegate

@synthesize window;
@synthesize navigationController, eventDataUp;
@synthesize url;


- (void)applicationDidFinishLaunching:(UIApplication *)application {

    //RootViewController *rvController = [[RootViewController alloc] init];



    NSURL *urlUpcoming = [[NSURL alloc] initWithString:@"http://www.randomosity.com.au/EventsUpcoming.xml"];
   // NSURL *urlWeekly = [[NSURL alloc] initWithString:@"http://www.randomosity.com.au/EventsWeekly.xml"];
    NSURL *url = urlUpcoming;
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

    //Initialize the delegate.
    XMLParser *parser = [[XMLParser alloc] initXMLParser];

    //Set delegate
    [xmlParser setDelegate:parser];

    //Start parsing the XML file.
    BOOL success = [xmlParser parse];

    if(success)
        NSLog(@"No Errors");
    else
        NSLog(@"Error Error Error!!!");

    // Configure and show the window
    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];
}


- (void)applicationWillTerminate:(UIApplication *)application {
    // Save data if appropriate
}


- (void)dealloc {
    [eventDataUp release];
    [navigationController release];
    [window release];
    [super dealloc];
}

@end

XMLParser

#import <UIKit/UIKit.h>

@class XMLAppDelegate, Book;

@interface XMLParser : NSObject {

    NSMutableString *currentElementValue;

    XMLAppDelegate *appDelegate;
    Book *eventUp; 
}

- (XMLParser *) initXMLParser;

@end


//
//  XMLParser.m
//  XML
//
//  Created by iPhone SDK Articles on 11/23/08.
//  Copyright 2008 www.iPhoneSDKArticles.com.
//

#import "XMLParser.h"
#import "XMLAppDelegate.h"
#import "Book.h"

@implementation XMLParser

- (XMLParser *) initXMLParser {

    [super init];

    appDelegate = (XMLAppDelegate *)[[UIApplication sharedApplication] delegate];

    return self;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict {

    if([elementName isEqualToString:@"EventsUpcoming"]) {
        //Initialize the array.
        appDelegate.eventDataUp = [[NSMutableArray alloc] init];
    }
    else if([elementName isEqualToString:@"Event"]) {

        //Initialize the book.
        eventUp = [[Book alloc] init];

        //Extract the attribute here.
        eventUp.eventUpID = [[attributeDict objectForKey:@"id"] integerValue];

        NSLog(@"Reading id value :%i", eventUp.eventUpID);
    }

    NSLog(@"Processing Element: %@", elementName);
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if(!currentElementValue) 
        currentElementValue = [[NSMutableString alloc] initWithString:string];
    else
        [currentElementValue appendString:string];

    NSLog(@"Processing Value: %@", currentElementValue);

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if([elementName isEqualToString:@"EventsUpcoming"])
        return;

    //There is nothing to do if we encounter the Books element here.
    //If we encounter the Book element howevere, we want to add the book object to the array
    // and release the object.
    if([elementName isEqualToString:@"Event"]) {
        [appDelegate.eventDataUp addObject:eventUp];

        [eventUp release];
        eventUp = nil;
    }
    else 
        [eventUp setValue:currentElementValue forKey:elementName];

    [currentElementValue release];
    currentElementValue = nil;
}

- (void) dealloc {

    [eventUp release];
    [currentElementValue release];
    [super dealloc];
}

@end


Quite a lot of code to digg through, but I think the problem lays here:

       if (segmentedControl.selectedSegmentIndex == 0)
        {

            mainDelegate.url = [[NSURL alloc] initWithString:@"http://www.randomosity.com.au/EventsUpcoming.xml"];
            [self.tableView reloadData];
        }
        else if (segmentedControl.selectedSegmentIndex == 1)
        {
            NSLog(@"Hello 2");

            mainDelegate.url = [[NSURL alloc]initWithString:@"http://www.randomosity.com.au/EventsWeekly.xml"];
            NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:mainDelegate.url];

            XMLParser *parser = [[XMLParser alloc] initXMLParser];
            [parser parse];
            [parser release];
    }

You are changing the url, and reloading the data in the tableview. But not parsing the xml again with the new url.

EDIT You can parse the XML just like you did before, but now place it somewhere so it's called again. Only I would call the [self.tableView reloadData] when you surely know when the parser is finished. In the parserDidEndDocument delegate method for instance, but that depends on how you format your code.

Check code above to see example

0

精彩评论

暂无评论...
验证码 换一张
取 消