0

我有一個tableview與頭部中的segmentedControl,我希望段控制改變數據取決於哪個段被點擊,在這種情況下即將/週刊。SegmentedControl更改TableView數據

兩個數據源都來自我的服務器上的XML文件,這與有問題的部分IM,作爲即時通訊還是新的使用的NSXMLParser

香港專業教育學院有一些代碼周圍亂,但無濟於事。我知道我的segmentAction正在被拾取,因爲我使用日誌來這樣做。附上代碼和我的表的形象,歡呼聲

當我點擊分段控件,使用新的XML源

:)

enter image description here

的實現代碼如下犯規更新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 (segmentedControl.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 
+0

什麼不起作用? – Joe 2011-06-11 07:34:18

+0

分段控件不會更改XML源 – Andyy 2011-06-11 07:42:46

回答

3

相當多的代碼到Digg通過,但我覺得這裏的問題規定:

 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]; 
    } 

您更改URL,並在tableview中重新加載數據。但不要再用新的url解析xml。

編輯 您可以像以前一樣解析XML,但現在將它放在某個地方,以便再次調用它。只有在確定知道解析器何時完成時,我纔會調用[self.tableView reloadData]。例如,在parserDidEndDocument委託方法中,但這取決於您如何格式化代碼。

檢查上面的代碼以查看示例

+0

ohhhh oki,我將如何解析新的URL? 它會從RootViewController或AppDelegate完成嗎? – Andyy 2011-06-11 08:25:55

+0

檢查我的編輯! – Jos 2011-06-11 08:37:15

+0

順便說一句,你也可以做兩個xml提要的子視圖。然後加載不同的子視圖。通過這種方式,每次在段之間切換時,解析器都不必運行。 – Jos 2011-06-11 08:57:50