Передача значений UITextView в ModalViewController из родительского View Controller - PullRequest
0 голосов
/ 26 мая 2011

Я работаю над школьным газетным приложением для iPad. Я наконец смог разобрать нужные мне статьи. Я помещаю каждое резюме статьи на родительский контроллер представления с UITextView Теперь я пытаюсь отобразить каждую статью с помощью ModalViewController при нажатии пользовательской кнопки в верхней части UITextView. Я просмотрел пару QA здесь в StackOverFlow, но не смог заставить мой проект работать. Я собираюсь поместить некоторые из моих кодов здесь и некоторые журналы на консоли. Любая помощь будет оценена. Заранее спасибо.

В моем ArticleViewController.h (который совпадает с ModalViewController.h)

@interface ArticleViewController : UIViewController {

    IBOutlet UIButton *doneReadingButton;
    IBOutlet UITextView *articleTextView;
}

@property (nonatomic, retain) UIButton *doneReadingButton;
@property (nonatomic, retain) UITextView *articleTextView;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withText:(NSString *)text;

-(IBAction)doneReadingArticle:(id)sender;
//-(IBAction)displayArticleView:(id)sender;

@end

В моем ArticleViewController.m (так же, как ModalViewController.m)

#import "ArticleViewController.h"


@implementation ArticleViewController

@synthesize doneReadingButton;
@synthesize articleTextView;

- (IBAction)doneReadingArticle:(id)sender {
    [self dismissModalViewControllerAnimated:YES];
}

//This is where I need to display main article in modal view
/*
- (IBAction)displayArticleView:(id)sender {
[self presentModalViewController:articleTextView animated:YES];
}
*/



 // The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withText:(NSString *)text {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
    if (self) {
        // Custom initialization.
        //self.articleTextView = [[UITextView alloc] init];
        //self.articleTextView.text = [text retain];
        self.articleTextView.text = text;
    }

    NSLog(@"********text in modal init******** >> %@",articleTextView.text);
    return self;
}



   // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

    //I guess, this is where I have to load main article
    self.articleTextView.text = @"This is a test!";

    NSLog(@"********text in modal******** >> %@",articleTextView.text);
}

В моем родительском контроллере представления

-(IBAction)articleView04:(id)sender{
    storyView04 = [[ArticleViewController alloc] initWithNibName:@"ArticleViewController" bundle:[NSBundle mainBundle]];

    storyView04.articleTextView.text =[NSString stringWithString:@"TESTING! TESTING!"];
    [storyView04 setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
    storyView04.modalPresentationStyle = UIModalPresentationPageSheet;
    [self presentModalViewController:storyView04 animated:YES];
    [storyView04 release];
}

Итак, в консоли я просто получаю это, который является просто текстом-заполнителем.

 2011-05-28 15:44:00.071 TheCalAggie[4179:207] ********text in modal******** >> This is a test!

Я знаю, что должен передать текстовое значение из родительского представления в ModalViewController, но я не уверен, правильно ли я его передаю. Поначалу мой код имеет смысл?

В любом случае. Пожалуйста, помогите мне с этим проектом. Я действительно должен закончить это в течение одной недели. Еще раз спасибо.

Ответы [ 3 ]

1 голос
/ 26 мая 2011

Я предполагаю, что вы использовали IB для создания представлений.В этом случае [[[ArticleViewController alloc] init] autorelease]; не будет загружать этот интерфейс для вас.Вам нужно будет использовать [[ArticleViewController alloc] initWithNibName:@"ArticleViewController" bundle:nil withText:@"Test!!"];, чтобы получить желаемый результат.

Но есть кое-что, что неправильно в том, как вы реализовали свой инициализатор.

self.articleTextView = [[UITextView alloc] init];
self.articleTextView.text = [text retain]; 

Во-первых, XIB создаст текстовое представление и будет связан с articleTextViewимущество.Поэтому нет необходимости создавать его снова.Более того, это представление не было добавлено как подпредставление к свойству view вашего контроллера, поэтому оно не будет отображаться на экране.Созданный IB текстовый вид останется на экране, но без ссылки.Вы должны удалить первую строку.Во-вторых, свойство text в текстовом представлении является свойством copied.Таким образом, ваше удержание может считаться утечкой.

self.articleTextView.text = text;

Все остальное вроде бы в порядке.

РЕДАКТИРОВАТЬ

-(IBAction)showArticleView:(UIButton *)sender{
    storyView = [[ArticleViewController alloc] initWithNibName:@"ArticleViewController" bundle:[NSBundle mainBundle]];

    storyView.articleTextView.text = [articles objectAtIndex:[sender tag]];
    [storyView setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
    storyView.modalPresentationStyle = UIModalPresentationPageSheet;
    [self presentModalViewController:storyView animated:YES];
    [storyView release];
}
1 голос
/ 26 мая 2011

Вот что я бы сделал (взято из моего текущего проекта):

#import <UIKit/UIKit.h>


@interface DictionaryViewController : UIViewController {
    NSString *word;
    NSString *definition;
    IBOutlet UIWebView *webView;
    IBOutlet UINavigationItem *navItem;
}

@property(nonatomic, copy) NSString *word;
@property(nonatomic, copy) NSString *definition;
@property(nonatomic, retain) IBOutlet  UIWebView *webView;
@property(nonatomic, retain) IBOutlet UINavigationItem *navItem;

-(IBAction) done;
-(IBAction) pronounce;

@end

Вот реализация:

#import "DictionaryViewController.h"
#import "TBXML.h"
#import "Lexicontext.h"
#import "Lexicontext+Pronounce.h"

@implementation DictionaryViewController

@synthesize word, definition, webView, navItem;

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"word"])
    {
        definition = [[Lexicontext sharedDictionary] definitionAsHTMLFor:word];
        [[self webView] loadHTMLString:definition baseURL:nil];
        navItem.title = word;
    }
}

-(void) done
{
    [self dismissModalViewControllerAnimated:YES];
}

-(void) pronounce
{
    [[Lexicontext sharedDictionary] pronounce:word];
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        [self addObserver:self forKeyPath:@"word" options:0 context:nil];
    }
    return self;
}

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

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    [[self webView] loadHTMLString:definition baseURL:nil];
    navItem.title = word;

    UIScrollView *scrollview = [[webView subviews] objectAtIndex:0];
    scrollview.bounces = NO;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

Как вы будете использовать это:

-(void) somethingHappened:(id) sender
{
     DictionaryViewController *dvc = [[DictionaryViewController alloc] initWithNibName:@"DictionaryViewController" bundle:[NSBundle mainBundle]];
     dvc.word = @"Some word to look up";
     [self presentModalViewController:dvc];
     [dvc release];
}
0 голосов
/ 26 июня 2011

ваш объект articleTextView получает строку "TESTING! TESTING!". Если вы не видите его в UITextview, который у вас есть на экране, это потому, что вы подключили его к переменной экземпляра с тем же именем (articleTextView). Возможно, вы захотите удалить IBOutlet из переменной экземпляра и поместить его в свойство. @property (nonatomic, retain) IBOutlet UITextView * articleTextView; вам, возможно, не нужно подключать его снова. Надеюсь, это устранит недоразумение, которое вы, вероятно, имеете между ivars и свойствами.

...