返回时,详细视图上的文本视图对象中的滚动位置不会重置

时间:2013-08-12 19:43:30

标签: iphone objective-c cocoa-touch interface-builder

我在主视图中有信息,它使用UITableView对象和我推送用户选择后出现的详细ViewContrailer。

我的挑战是滚动UITextView对象,它不会返回到详细视图上滚动区域的顶部。

用户从主视图控制器的列表中选择一个详细信息对象,然后在详细的ViewController中显示它。然后,她在UITextView对象中滚动 - dogScrollingInfoTextView-在该视图上向下移动,使得上面的线不再显示。然后她返回主视图控制器,并选择另一行。返回到详细视图后,新对象的UITextView对象(dogScrollingInfoTextView)仍然位于上一个视图离开的位置。

在detailViewController中传递给此UITextView的对象在主视图控制器中如下所示

  self.detailViewController.dogScrollingInfo = dog.whatMakesDogSpecial;

在原始类定义中,此属性声明为此

@property(强,非原子)NSString * whatMakesDogSpecial;

用于在detailView控制器类中传输到视图的对象声明为此

 @property (strong, nonatomic) NSString *dogScrollingInfo;
 @property (weak, nonatomic) IBOutlet UITextView *dogScrollingInfoTextView;

并且在detailViewController实现中,传输看起来像这样

 self.dogScrollingInfoTextView.text = [self.dogScrollingInfo description];

我不确定是否应该附加屏幕截图? 我应该加入任何其他代码吗? (我在下面放了两个方法,每个视图控制器类一个)

我在UITextView类或UIView类中找不到与滚动有关的任何内容,这告诉我必须以编程方式执行某些操作。这似乎与InterfaceBuilder有关。我正在使用xib的NOT故事板。但我在不同的检查员中找不到任何改变这种行为的选择。

我在详细视图控制器类中使用configureView,可能不是正确的方法吗?我想我在Xcode Master-Detail项目模板中使用configureView方法找到了一个例子,尽管我是从Single View项目模板构建我的应用程序。如果没有,我将如何找出使用的方法?

我正在努力学习如何使用苹果文档来解决这样的挑战,但我发现很难导航它。因此,非常感谢指导如何更好地使用文档。

....来自Master View Controller类的代码片段......

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (!self.detailViewController) {
        self.detailViewController = [[HardlyWorkingDogsDetailViewController alloc]
                                     initWithNibName:@"HardlyWorkingDogsDetailViewController"
                                     bundle:nil ];

    }
    NSLog(@"The user selected dog @array position %d", indexPath.row);

    Dog *dog = self.sortedDogDictionaryArray[indexPath.row];


    self.detailViewController.dogName= dog.dogName;

    self.detailViewController.dogLicense = dog.licenseString;

    self.detailViewController.dogScrollingInfo = dog.whatMakesDogSpecial;

    self.detailViewController.dogPhoto = dog.dogPhoto;


    [self.navigationController pushViewController:self.detailViewController animated:YES];


  }

....详细视图控制器类中的代码片段...

-(void)configureView {
    //NSLog(@"ConfigureView # 1 in detail vu");
    if (self.dogLicense) {

        self.dogLicenseUILabel.text = [self.dogLicense description];
        self.dogNameUIText.text = [self.dogName description];


        self.dogScrollingInfoTextView.text = [self.dogScrollingInfo description];

        self.dogPhotoUIImage.image = self.dogPhoto;


    }
}

谢谢 月桂

1 个答案:

答案 0 :(得分:1)

由于您正在重用HardlyWorkingDogsDetailViewController,因此这种行为很有意义。如果HardlyWorkingDogsDetailViewController足够轻,那么确实没有必要重复使用它。只需每次重新解决它就可以解决您的问题:

self.detailViewController = [[HardlyWorkingDogsDetailViewController alloc] initWithNibName:@"HardlyWorkingDogsDetailViewController" bundle:nil ];

Dog *dog = self.sortedDogDictionaryArray[indexPath.row];

self.detailViewController.dogName= dog.dogName;
self.detailViewController.dogLicense = dog.licenseString;
self.detailViewController.dogScrollingInfo = dog.whatMakesDogSpecial;
self.detailViewController.dogPhoto = dog.dogPhoto;

[self.navigationController pushViewController:self.detailViewController animated:YES];

虽然没有看到你的其他逻辑,但我不能说如果你的任何代码依赖于self.detailViewController只创建一次(在其他地方保留对它的引用,例如),那么就不会引入其他错误)。如果是这种情况,或者您只是不想更改MasterViewController代码,则可以简单地将以下内容放在HardlyWorkingDogsDetailViewController中:

-(void)viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];
     [self.dogScrollingInfoTextView setContentOffset:CGPointMake(0, 0) animated:NO];
}

这使得每次视图即将出现在屏幕上时,滚动视图将被设置回顶部。 (viewDidLoadviewWillAppear:viewDidAppear:viewWillDisappear:viewDidDisappear:UIViewController生命周期的一部分,非常有用。您应该阅读它们)

在旁注中,UITextView是使用UIScrollView实现的,因此UIScrollView具有的任何滚动方法,UITextView也可以。 More info here