1

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

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

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

在 detailViewController 中传递给这个 UITextView 的对象,在 Master View Controller 中看起来像这样

  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 故事板。但是我在不同的 Inspectors 中找不到任何改变这种行为的选择。

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

我正在尝试学习使用苹果文档来解决这样的挑战,但我发现很难驾驭它。因此,非常感谢有关如何更好地使用文档的指针。

....来自主视图控制器类的代码片段...

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


  }

.... Detail View Controller 类中的代码片段...

-(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;


    }
}

谢谢劳雷尔

4

1 回答 1

1

由于您正在重用 a 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];
}

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

附带说明,UITextView是使用 a 实现的,因此 a具有的UIScrollView任何滚动方法,也可以这样做。更多信息在这里UIScrollViewUITextView

于 2013-08-12T20:20:17.723 回答