【问题标题】:Text view not being populated with text after calling method and moving to a view controller with the same button click调用方法并通过单击相同的按钮移动到视图控制器后,文本视图未填充文本
【发布时间】:2015-06-13 20:45:01
【问题描述】:

我试图让我的 iOS 应用程序从服务器上的文本文件中提取并在文本视图中显示它。如果我只是通过在 viewDidLoad 方法中设置 url 来做到这一点,这很好用。但是,如果我按照我需要的方式进行操作,则单击按钮会调用一个方法,该方法根据单击的按钮设置 url,然后在移动到视图控制器时也填充 Text 视图,然后 Text 视图不会收到任何文本.

我不确定这是否与它有关,但可能是因为我正在使用一个按钮,该按钮具有触发的 segue 以移动到下一个视图控制器,然后发送事件以拉动信息?会不会是乱码之类的?

这是我的代码:

#import "ViewController.h"
#import "STTwitter.h"

@interface ViewController ()
{
    STTwitterAPI *twitter;
}
@property (weak, nonatomic) IBOutlet UITextView *scheduleText;
@property (weak, nonatomic) IBOutlet UITextView *tweetText;
@property (weak, nonatomic) IBOutlet UIScrollView *mScrollView;

@end

@implementation ViewController

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

    //pull from server to populate schedule
    //[self pullInfo:(1)];

    //load tweets
    //[self callTwitter];

    //set scroll view size
    _mScrollView.contentSize = CGSizeMake(320, 300);

}//end viewDidLoad

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}//end didReceiveMemoryWarning

- (void) pullInfo: (int) page
{//pull information from server
    NSError* err;
    NSURL* url = nil;

    if (page == 1)
        url = [NSURL URLWithString:@"http://www.mckendree.edu    /aecschedule1.txt"];
    else if (page == 2)
        url = [NSURL URLWithString:@"http://www.mckendree.edu/aecschedule2.txt"];
    else if (page == 3)
        url = [NSURL URLWithString:@"http://www.mckendree.edu/aecschedule3.txt"];
    else if (page == 4)
        url = [NSURL URLWithString:@"http://www.mckendree.edu/aecschedule4.txt"];
    else if (page == 5)
        url = [NSURL URLWithString:@"http://www.mckendree.edu/aecschedule5.txt"];
    else if (page == 6)
        url = [NSURL URLWithString:@"http://www.mckendree.edu/aecschedule6.txt"];
    else if (page == 7)
       url = [NSURL URLWithString:@"http://www.mckendree.edu/aecschedule7.txt"];
    else if (page == 8)
        url = [NSURL URLWithString:@"http://www.mckendree.edu/aecschedule8.txt"];
    else if (page == 9)
        url = [NSURL URLWithString:@"http://www.mckendree.edu/aecschedule9.txt"];
    else if (page == 10)
        url = [NSURL URLWithString:@"http://www.mckendree.edu/aecschedule10.txt"];
    else if (page == 11)
        url = [NSURL URLWithString:@"http://www.mckendree.edu/aecschedule11.txt"];
    else if (page == 12)
        url = [NSURL URLWithString:@"http://www.mckendree.edu/aecschedule12.txt"];
    else if (page == 13)
        url = [NSURL URLWithString:@"http://www.mckendree.edu/aecschedule13.txt"];

    NSData *htmlData = [NSData dataWithContentsOfURL:url];
    NSAttributedString *attrString = [[NSAttributedString alloc] initWithData:htmlData options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} documentAttributes:nil error:nil];

    //retrieve the text if there was no reading error
    if (err != nil)
        printf("Error retrieving text");
    else
    {
        [_scheduleText setAttributedText:attrString];
        [_scheduleText sizeToFit];
        [_scheduleText setTextColor:[UIColor whiteColor]];
    }//end else
}//end pullInfo

- (IBAction)settingsClicked:(id)sender
{
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"McK AEC" message:@"Developed by: Sean Boehnke" preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {}];
    [alert addAction:defaultAction];
    [self presentViewController:alert animated:YES completion:nil];
}//end settingsClicked

- (IBAction)time1Clicked:(id)sender
{
    [self pullInfo:(1)];
}//end time1Clicked

- (IBAction)time2Clicked:(id)sender
{
    [self pullInfo:(2)];
}//end time2Clicked

- (IBAction)time3Clicked:(id)sender
{
    [self pullInfo:(3)];
}//end time3Clicked

- (IBAction)time4Clicked:(id)sender
{
    [self pullInfo:(4)];
}//end time4Clicked

- (IBAction)time5Clicked:(id)sender
{
    [self pullInfo:(5)];
}//end time5Clicked

- (IBAction)time6Clicked:(id)sender
{
    [self pullInfo:(6)];
}//end time6Clicked

- (IBAction)time7Clicked:(id)sender
{
    [self pullInfo:(7)];
}//end time7Clicked

- (IBAction)time8Clicked:(id)sender
{
    [self pullInfo:(8)];
}//end time8Clicked

- (IBAction)time9Clicked:(id)sender
{
    [self pullInfo:(9)];
}//end time9Clicked

- (IBAction)time10Clicked:(id)sender
{
    [self pullInfo:(10)];
}//end time10Clicked

- (IBAction)time11Clicked:(id)sender
{
    [self pullInfo:(11)];
}//end time11Clicked

- (IBAction)time12Clicked:(id)sender
{
    [self pullInfo:(12)];
}//end time12Clicked

- (IBAction)time13Clicked:(id)sender
{
    [self pullInfo:(13)];
}//end time13Clicked

@end

【问题讨论】:

  • 1.始终尝试发布尽可能少的代码。 2. 你确定 URL 确实返回了有效数据吗? 3.尝试设置textView的背景颜色,看看frame设置是否正确。
  • @iosDev82 是的,它返回数据。正如我在帖子中所说,如果我只是直接从 viewDidLoad 方法调用 pullInfo 方法,那么它会很好。这就是为什么我觉得将其移至视图控制器并同时调用单独的方法时遇到问题。
  • 问题不清楚。我可以看到许多 timeclicked 动作,但没有一个执行 segue。或者这个 viewcontroller 是 segued 并且数据没有填充到 textview 中的那个?
  • @UttamSinha 我正在使用情节提要,这是我编辑过任何代码的唯一文件。我只需要从不同的 url 中提取每个按钮并在我移动的下一个视图控制器上填充文本视图从情节提要。
  • @saboehnke - 如果是这种情况,则在下一个视图控制器中定义属性 nstring 并在第一个视图控制器中导入下一个视图控制器,以实例为例,当您转到下一个视图控制器时,将获取的数据分配给 nsstring。

标签: ios objective-c textview storyboard viewcontroller


【解决方案1】:

因此,根据您对问题的描述和您的 cmets,这里存在一些基本问题。首先,这不会在您推送的 viewController 上填充数据的原因是因为您在 scheduleText 上设置了属性文本,这是 ViewController 上的一个实例变量。如果在按下这些按钮后您正在推动另一个 viewController,那么您正在推动的控制器将没有此数据集是非常有意义的,因为您没有在那里设置它,而是在前一个控制器上设置它。该数据没有理由假设您实际上打算将其传递出去。这根本不是你要求它做的。如果您的意图是向前传递数据,并且您对故事板 segues 有心,您将需要实现 prepareForSegue 并公开一个属性,您可以使用该属性来配置新的 viewController,因为它正在为演示做准备。

对不起,文字墙,但这是我的建议,以解决这个问题。

第一步,在您的故事板上,将所有按钮连接到界面构建器右侧窗格的首选项选项卡中的 segues 按钮标签。您应该将它们标记为 1 到 13(传统上说从 0 开始,但这将使下一步更简单。)

接下来,去掉按钮的所有 IBAction。我们将不再需要它们,它们会使您的课堂变得混乱。 删除方法后,您还必须在情节提要中取消挂钩,否则您的应用将崩溃并显示“此类不符合键值编码”的错误

接下来,您需要在 viewController 上实现方法 -prepareForSegue 来完成剩下的繁重工作

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSAttributedString *attrString;

    if ([sender isKindOfClass:[UIButton class]]) {
        NSUInteger seguePageNumber = ((UIButton *)sender).tag;
        attrString = [self pullInfo:seguePageNumber];
    }

    YourViewControllerClass *vc = (YourViewControllerClass*)[segue destinationViewController];
    vc.attributedTextPropertyIExposed = attrString;
    //This property needs to be exposed in the new VC's header file. Once the new controller presents you can then use this property to set the string the way you want.
}

作为奖励,这是我在上面引用的一种拉取信息方法,我发现它更容易阅读。

- (NSAttributedString *)pullInfo:(NSUInteger)pageNumber
{
    NSString* urlString = [NSString stringWithFormat:@"http://www.mckendree.edu/aecschedule%lu.txt", (long)pageNumber];
    NSURL *url = [NSURL URLWithString:urlString];
    NSData *htmlData = [NSData dataWithContentsOfURL:url];
    NSAttributedString *attrString = [[NSAttributedString alloc] initWithData:htmlData options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} documentAttributes:nil error:nil];
    return attrString;
}

【讨论】:

  • 如果是这种情况,为什么我直接在viewDidLoad方法中调用pullInfo方法就可以拉取信息并正确显示?
  • 因为如果你在 viewDidLoad 上调用它,你是在当前可见的 viewController 上设置属性。如果您呈现另一个视图控制器,那么您刚刚设置文本的视图控制器已经隐藏在新呈现的控制器下。它可能正在工作,但不再可见。
  • 好的,但无论哪种方式,文本都显示在不同的视图控制器中。我想这就是我不理解的原因。
  • 有没有办法做到这一点,因为我正在处理的两个视图控制器都在同一个自定义类名下?我的意思是说这只是让我更加困惑为什么我需要参考下一个视图
  • 如果您呈现一个新视图并且您无法访问它或它的属性,那么您将无法配置它或根据前一个控制器中的操作填充数据。您需要在即将呈现的控制器上显式设置属性,或者找出一种方法让控制器在呈现之前自行配置。在呈现的视图控制器上设置一个属性,然后立即呈现另一个对下一个控制器绝对没有影响并掩埋结果。您实际上是在为不再存在的事物设置属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 2013-10-14
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多