尝试从 UIViewController 将属性分配给 UIScrollView 类

Posted

技术标签:

【中文标题】尝试从 UIViewController 将属性分配给 UIScrollView 类【英文标题】:Trying to assign a property to a UIScrollView class from UIViewController 【发布时间】:2011-11-29 18:21:32 【问题描述】:

我正在尝试深入研究多个UITableViewControllers,最终得到一个根据用户选择的部分和行加载的 pdf 文件。我正在尝试将部分和行信息传递给PDFViewController(有效),但我无法将选定的部分和行信息传递给实际加载PDF 的UIScrollView。我试图在实例化PDFScrollView 时设置一个属性,但是在加载PDFScrollView 时不会保留该值。

来自 PDFViewController.m 的代码

#import "PDFViewController.h"
#import "PDFScrollView.h"
#import "ProtocolDetailViewController.h"

@implementation PDFViewController

@synthesize detailIndexRow;
@synthesize detailIndexSection;


- (void)loadView 
    [super loadView];
// Log to check to see if detailIndexSection has correct value
NSLog(@"pdfVC section %d", detailIndexSection);
NSLog(@"pdfVc row %d", detailIndexRow);

// Create PDFScrollView and add it to the view controller.
    PDFScrollView *sv = [[PDFScrollView alloc] initWithFrame:[[self view] bounds]];
    sv.pdfIndexSection = detailIndexSection;

   [[self view] addSubview:sv];


现在来自PDFScrollView.m,其中pdfIndexSection 不保留在上面来自detailIndexSection 的代码中分配给它的值

#import "PDFScrollView.h"
#import "TiledPDFView.h"
#import "PDFViewController.h"
#import <QuartzCore/QuartzCore.h>

@implementation PDFScrollView

@synthesize pdfIndexRow;
@synthesize pdfIndexSection;




- (id)initWithFrame:(CGRect)frame

// Check to see value of pdfIndexSection
NSLog(@"PDF section says %d", pdfIndexSection);
NSLog(@"PDF row says %d", pdfIndexRow);

 if ((pdfIndexSection == 0) && (pdfIndexRow == 0)) 

            NSURL *pdfURL = [[NSBundle mainBundle] URLForResource:@"cardiacarrestgen.pdf" withExtension:nil];
            pdf = CGPDFDocumentCreateWithURL((__bridge_retained CFURLRef)pdfURL);
    
    else if ((pdfIndexSection == 0) && (pdfIndexRow == 1)) 

            NSURL *pdfURL = [[NSBundle mainBundle] URLForResource:@"cardiacarrestspec.pdf" withExtension:nil];
            pdf = CGPDFDocumentCreateWithURL((__bridge_retained CFURLRef)pdfURL);

    

pdfIndexSectionpdfIndexRow 都是int 并返回0,无论在didSelectRowAtIndexPath 中选择了哪个部分或行。

那么两个问题:

为什么当我在ViewController 中为sv.pdfIndexSection 分配一个int 值时,它不会保留ScrollView 中的值。

有没有更好的方法来实现这个概念?

【问题讨论】:

【参考方案1】:

问题在于,在 PDFScrollView 中,您正在 initWithFrame 方法中访问字段 pdfIndexSectionpdfIndexRow,但您只是在调用它之后设置它们的值。

换句话说,您在 PDFScrollView 中的- (id)initWithFrame:(CGRect)frame 应该重写为

// PDFScrollView
-(id)initWithFrame:(CGRect)frame 
pdfIndexRow:(int) pdfindexRow 
pdfIndexSection:(int)pdfIndexSection

然后在你的 PDFViewController 中你像初始化它一样

PDFScrollView *sv = [[PDFScrollView alloc] initWithFrame:[[self view] bounds] 
pdfIndexRow:detailIndexRow 
pdfIndexSection:detailIndexSection ];

不同之处在于现在您在 init 方法中传递值,因为您在那里使用它们。另一种方法是不在 initWithFrame 方法中执行 PDF 加载逻辑,而是在单独的方法中执行。这样,您可以保持 initWithFrame 简单,并有时间在加载 PDF 之前正确初始化您可能拥有的任何其他字段。

【讨论】:

谢谢!这是完全有道理的并纠正了问题。非常感谢!

以上是关于尝试从 UIViewController 将属性分配给 UIScrollView 类的主要内容,如果未能解决你的问题,请参考以下文章

从 UITabBar 初始化 UIViewController 的属性

将数据从 UITableView 传递到 UIViewController

将数据从 UIViewControllerRepresentable 传递给 UIViewController

将带有分页的 UIScrollView 添加到现有的 UIViewController

将 NSString 从 UIViewController 传递到另一个

将 UIViewController 设置为另一个 UIViewController 的属性是否一个坏主意?