initWithFrame 和 initWithCoder

initWithFrame  和   initWithCoder


当我们所写的程序里没用用Nib文件(XIB)时,用代码控制视图内容,需要调用initWithFrame去初始化

- (id)initWithFrame:(CGRect)frame

{

    if (self =[superinitWithFrame:frame]) {

        // 初始化代码

    }

    return self;

}


用于视图加载nib文件,从nib中加载对象实例时,使用 initWithCoder初始化这些实例对象

- (id)initWithCoder:(NSCoder*)coder

{

    if (self =[superinitWithcoder:coder]) {

        // 初始化代码

    }

    return self;

}


注释:本文原地址:http://blog.youkuaiyun.com/duxinfeng2010/article/details/7687829

帮我解释一下下面代码:// #import "TPBLabel.h" #pragma mark -overrides @implementation TPBLabel - (instancetype)initWithFrame:(NSRect)frameRect { self = [super initWithFrame:frameRect]; if (self) { [self setupInitialData]; [self configure]; } return self; } - (instancetype)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self) { [self setupInitialData]; [self configure]; } return self; } - (void)setupInitialData { self.font = self.defaultFont; self.textColor = self.defaultTextColor; self.backgroundColor = self.defaultBackgroundColor; self.numberOfLines = 1; self.textAlignment = NSTextAlignmentNatural; self.lineBreakMode = NSLineBreakByTruncatingTail; } - (void)configure { self.editable = NO; self.selectable = NO; self.bezeled = NO; self.drawsBackground = NO; self.usesSingleLineMode = NO; self.font = self.font; self.textColor = self.textColor; self.alignment = self.textAlignment; self.maximumNumberOfLines = self.numberOfLines; self.lineBreakMode = self.lineBreakMode; self.backgroundColor = self.backgroundColor; [self setContentCompressionResistancePriority:NSLayoutPriorityDefaultLow forOrientation:NSLayoutConstraintOrientationHorizontal]; } - (NSSize)intrinsicContentSize { if (TPBIsEmptyString(self.text)) { return CGRectZero.size; } else { return [super intrinsicContentSize]; } } - (NSFont*)defaultFont { return [NSFont tpr13Regular]; } - (NSColor*)defaultTextColor { return [NSColor tpTextPrimary]; } - (NSColor*)defaultBackgroundColor { return [NSColor clearColor]; } #pragma mark - #pragma mark setters which invalidate the view - (NSString *)text { return self.stringValue; } - (void)setText:(NSString *)text { if (text != nil) { self.stringValue = text; } } - (NSAttributedString *)attributedText { return self.attributedStringValue; } - (void)setAttributedText:(NSAttributedString *)attributedText { if (attributedText != nil) { self.attributedStringValue = attributedText; } } - (void)setTextAlignment:(NSTextAlignment)textAlignment { _textAlignment = textAlignment; self.alignment = _textAlignment; } - (void)setNumberOfLines:(NSInteger)numberOfLines { _numberOfLines = numberOfLines; self.maximumNumberOfLines = numberOfLines; } @end
09-29
<think>我们正在讨论iOS开发中的视图初始化方法。在iOS的UIKit框架中,`init``initWithFrame:`是UIView的初始化方法,而`initWithNibName:bundle:``initWithCoder:`是UIViewController的初始化方法。然而,问题中的“initview”“initmodalview”并不是标准的术语。可能用户指的是: - “initView”可能是指自定义视图(UIView)的初始化方法,比如重写`init(frame:)`或`init?(coder:)`。 - “initModalView”可能是指初始化一个模态视图控制器(UIViewController),特别是以模态方式呈现的视图。 但是,为了准确回答,我将基于常见的iOS开发实践来解释: 1. **initView(视图初始化)**: - 通常指初始化一个`UIView`子类的实例。 - 常见的方法有: - `init(frame: CGRect)`: 用指定的CGRect初始化视图。 - `init?(coder: NSCoder)`: 从Storyboard或XIB文件中加载视图时调用的初始化方法。 2. **initModalView(模态视图初始化)**: - 模态视图一般指的是以模态方式呈现的视图控制器(UIViewController)。 - 初始化一个视图控制器(无论是模态还是全屏)通常使用其默认的初始化方法,比如: - `init()`: 无参数初始化。 - `init(nibName: String?, bundle: Bundle?)`: 从Nib文件初始化。 - 而“模态”主要体现在如何呈现这个视图控制器,即使用`present(_:animated:completion:)`方法。 因此,两者的主要区别在于: - **initView**:用于创建视图(UIView)实例,负责视图的布局绘制。 - **initModalView**:这个说法不标准,但可以理解为初始化一个将要被模态呈现的视图控制器(UIViewController)。重点在于视图控制器的初始化,然后以模态方式呈现。 总结:视图初始化(initView)是创建视图对象本身,而模态视图初始化(initModalView)实际上是初始化一个视图控制器,并准备以模态方式显示。 注意:在iOS中,没有名为“initModalView”的官方方法。模态展示是一种呈现方式,与初始化方法无关。 根据以上分析,回答如下: </think>在 iOS 开发中,`initView` `initModalView` 通常指代不同的视图初始化方式,主要区别体现在**使用场景****生命周期管理**上: ### 核心区别 1. **使用目的** - `initView`:通用视图初始化方法,用于创建普通视图(UIView)或视图控制器(UIViewController) - `initModalView`:专为模态视图设计的初始化方法,通常用于对话框、弹窗等需要覆盖当前界面的场景 2. **呈现方式** ```swift // initView 的典型用法(普通视图) let viewController = MyViewController() navigationController?.pushViewController(viewController, animated: true) // initModalView 的典型用法(模态视图) let modalVC = ModalViewController() modalVC.modalPresentationStyle = .pageSheet // 设置模态样式 present(modalVC, animated: true) ``` 3. **生命周期控制** | 特性 | initView | initModalView | |---------------------|------------------------------|--------------------------------| | 视图层级 | 嵌入导航栈或作为子视图 | 独立覆盖在当前视图之上 | | 退出方式 | 需主动弹出或移除 | 支持下滑手势自动关闭(默认) | | 内存管理 | 由父控制器管理 | 短暂存在,关闭后立即释放 | | 交互阻断 | 不阻断底层视图交互 | 默认阻断底层交互(可配置) | 4. **设计规范差异** - `initModalView` 通常需要额外配置: ```swift func initModalView() { let modal = CustomModal() modal.modalTransitionStyle = .coverVertical // 动画类型 modal.modalPresentationCapturesStatusBarAppearance = true // 状态栏控制 modal.isModalInPresentation = true // 阻止下滑关闭 } ``` - 而 `initView` 更关注视图本身的内容构建 ### 实际应用场景 - **使用 `initView` 的情况**: 构建主页、列表页等常规界面,或作为复杂界面的子组件 - **使用 `initModalView` 的情况**: 临时操作(如选择日期)、警告弹窗(Alert)、半屏表单(Sheet)等需要聚焦用户注意力的场景 > ⚠️ 注意:iOS 开发中并无 `initModalView` 官方方法名,这是对模态视图初始化模式的通用表述,实际通过 `present(_:animated:)` 实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值