SegmentedControl to change TableView data
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
:)
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
精彩评论