【iOS】不要在loadView()中调用self.view
因为当self.view返回nil时,会再次调用loadView()生成一个View赋值给self.view,所以会出现循环引用。
【iOS】去除searchBar上下黑线
searchBar.setBackgroundImage(UIImage())
【iOS】通过点击cell上的button获得对应cell的IndexPath
方法一,通过button的superView:
let cell: UITableViewCell = button.superview as! UITableViewCell
let indexPath: IndexPath = self.tableView.indexPath(for: cell)
【iOS】关于Delegate传值
主要用于返回时传值,不适用与对一个新界面传值
protocol自不必多说,首先明确Delegate和Implement:
比如A想要接收通过B传过来的值:
A 就是Implement,B 就是Delegate
5步走:
1、在Protocol中定义一个赋值的方法:func passValue(_ value: String)
2、B中申明一个Protocol的对象:var delegate: Protocol?
3、A中实现Protocol:class A:Protocol
4、在A跳转/引用B的函数中,赋值B的对象:b.delegate = self
5、在B返回/回调A的函数中调用Protocol定义的赋值方法,即可:self.delegate?.passValue("new value")
【iOS】上传App包含药品商城,被打回
PLA 1.2
We found that the Seller and/or Artist names associated with your app do not reflect the name of the financial institution in the app and/or its name and metadata.
To be appropriate for the App Store, your app must be published under a Seller name and Artist name that reflects the financial institution brand, as required by the iOS Developer Program License Agreement.
Section 1.2:
"You" and "Your" means and refers to the person(s) or legal entity (whether the company, organization, educational institution, or governmental agency, instrumentality, or department) using the Apple Software or otherwise exercising rights under this Agreement. For the sake of clarity, You may authorize contractors to develop Applications on Your behalf, but any such Applications must be submitted under Your developer account.
If you have published these apps on behalf of a client, it would be appropriate for your client to enroll in the iOS Developer Program, then add you to their development team so you can develop an app for them to submit under their developer account.
报错见上(我之前的找不到了,苹果也没有历史记录详情),更改的话,网上说的其实也就是直接翻译,这里说下,其实很简单,保证你打包的账号:
和你在https://itunesconnect.apple.com发布app的账户一致,当然这个账户是你app关联公司的旗下啦。
【iOS】有时候需要使用UILabel开头包含图片的效果
有几种做法,开始想到的就是前面的“新品”用图片,后面想想其实自己画一个UILabel也可以,无论怎么样,前面的位置总是要空出来的,这里用到AttributedText属性:
class func settingAttributes(with firstLineHeadIndent:CGFloat) -> [String:Any] {
let paragraphStyle:NSMutableParagraphStyle = NSMutableParagraphStyle()
paragraphStyle.firstLineHeadIndent = firstLineHeadIndent
let attributsDic:Dictionary= [NSParagraphStyleAttributeName: paragraphStyle]
return attributsDic
}
设置这个方法后,只需要在使用的时候调用一下就好啦:
cell.labelCommodityName.attributedText = NSAttributedString(string: "假装是超长的文本", attributes:UILabel.settingAttributes(with:30))//这里的30是前面空出的距离,可调整
【Any】计数从0还是1开始
当该数值是提供给计算机识别时,从0开始;
当该数值是提供给人识别时,从1开始;
【iOS】UIImage中添加UIButton无点击事件触发
解决方案:设置UIImage的userInteractionEnabled为True
原因:这要从iOS的点击事件处理流程说起:
1、当用户点击界面的时候,系统会将该事件加入到一个由UIApplication管理的事件队列中;
2、当UIApplication对事件队列中的进行分发处理的时候,通常会先发送事件给应用程序的主窗口,也就是UIWindow;
3、UIWindow会调用hitTest:withEvent:方法,在UIView视图层的结构中国年找到最合适的UIView来处理;
4、hitTest:withEvent:处理流程如下:
1)、首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前View中;
2)、若上面的方法返回NO,说明不在当前View中,则调用他的hitTestTest:withEvent:返回nil;
3)、若上面的方法返回YES,说明在当前的视图中,则遍历当前视图的所有子视图,然后在调用子视图的hitTest:withEvent:重复上面的步骤,直到有子视图返回非空对象(没有自视图了),或者全部子视图遍历结束;
4)、若第一个才有子视图的hitTest:withEvent:方法返回非空对象,则当前视图的hitTest:withEvent:方法就返回这个对象,处理结束;
5)、若所有子视图都返回nil,则当前视图的hitTest:withEvent:方法返回当前视图自身(self)
最终,这个触摸事件交给主窗口的hitTest:withEvent:方法返回的视图对象去处理;
注:hitTest:withEvent:方法会忽略以下视图:
1、隐藏的视图;
2、禁止用户操作(userInteractionEnabled=NO)的视图;(就是UIImage中添加UIButton的问题)
3、alpha<0.01的视图;
4、如果子视图的区域超过父视图的区域,就是父视图的clipsToBounds=No,则子视图超过父视图的区域也会显示,那么正常情况下父视图区域外的触摸操作不会被识别,因为父视图的pointInside:withEvent:方法会返回NO,这样就不会继续向下遍历子视图了,也就是说这个超过父视图的子视图,处于一个无主状态。当然你可以重写pointInside:withEvent:方法来处理这种特殊情况;
结论,因为UIImage的userInteractionEnabled默认为NO,所以会被hitTest:withEvent:忽略掉。
【iOS】Core Data
主要记住三个关键词:NSManagedObjectModel、NSPersistentStoreCoordinator、NSManagedObjectContext
NSManagedObjectModel:托管对象,被管理的对象模型
NSPersistentStoreCoordinator:持久化存储助理,数据库的连接器
NSManagedObjectContext:托管对象上下文,操作增删改查的对象
当然还有NSFetchRequest(获取数据的请求,相当于查询语句)、NSPredicate(查询的条件)、NSEntityDescription(实体结构)
操作数据库,简单分为两步:
1、获得托管对象上下文:
2、操作数据:
[