SegmentedControl для изменения данных TableView - PullRequest
0 голосов
/ 11 июня 2011

У меня есть табличное представление с segmentedControl в заголовке, я хочу, чтобы элемент управления сегмента изменял данные в зависимости от того, на каком сегменте щелкнули, в данном случае в предстоящем / еженедельном.

Оба источника данных получены из XMLфайл на моем сервере, с которой у меня возникли проблемы, так как я все еще новичок в использовании NSXMLParser

. Я портился с некоторым кодом, но безрезультатно.Я знаю, что мой сегмент Действие выбирается, потому что я использовал журналы для этого.прилагается код и изображение моей таблицы, ура

Когда я щелкаю сегментированный элемент управления, представление таблицы не обновляется с новым источником 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

1 Ответ

3 голосов
/ 11 июня 2011

Довольно много кода, чтобы копаться, но я думаю, что проблема лежит здесь:

       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-адрес и перезагружаете данные в виде таблицы. Но не анализировать XML снова с новым URL.

EDIT Вы можете анализировать XML так же, как раньше, но теперь поместите его куда-нибудь, чтобы он вызывался снова. Только я бы вызвал [self.tableView reloadData], когда вы точно знаете, когда анализатор завершен. Например, в методе делегата parserDidEndDocument, но это зависит от того, как вы форматируете свой код.

Проверьте код выше, чтобы увидеть пример

...