我在主视图中有信息,它使用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;
}
}
谢谢 月桂
答案 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];
}
这使得每次视图即将出现在屏幕上时,滚动视图将被设置回顶部。 (viewDidLoad
,viewWillAppear:
,viewDidAppear:
,viewWillDisappear:
,viewDidDisappear:
是UIViewController
生命周期的一部分,非常有用。您应该阅读它们)
在旁注中,UITextView
是使用UIScrollView
实现的,因此UIScrollView
具有的任何滚动方法,UITextView
也可以。 More info here