這篇文章的內(nèi)容包含:UITableViewCell的真實(shí)結(jié)構(gòu)在iOS的環(huán)境下使用正則表達(dá)式如何優(yōu)雅的隱藏tabbar如何修改navigationbar的顏色運(yùn)行時(shí)修改使用autolayout的viewnavigation controller子view偏移問題CoreData的使用總結(jié)1.UITableViewCell的真實(shí)結(jié)構(gòu)目標(biāo)是想把UITableview在editing模式下的drag按鈕去掉,換成自己的樣式,但又想保留原生拖動排序的行為,所以研究了很多方法,最后還是找到了UITableViewCell的結(jié)構(gòu),并將拖動按鈕替換。不多說,上代碼。//打印出來的自定義的cell在editing模式下的結(jié)構(gòu)(lldb) po self>(lldb) po self.subviews5 elements- [0] :; layer =>- [1] : <_UITableViewCellSeparatorView: 0x7d087c40; frame = (15 55; 305 1); layer =>- [2] : <_UITableViewCellSeparatorView: 0x7b163240; frame = (15 55.5; 305 0.5); layer =>- [3] :>- [4] :>(lldb) po self.subviews.lastOptional- Some :>(lldb) po self.subviews.last?.subviewsOptional>Some : 1 elements- [0] :>
(lldb)
可以看到此時(shí)contentView左右都向內(nèi)縮進(jìn)了一定的距離,最后有一個view叫UITableViewCellReorderControl,我想就是它了,然后看它的subviews,竟然包含了一個UIImageView,果斷替換之,代碼如下。
override func layoutSubviews() {
super.layoutSubviews()
setupReorderControl()
}
func setupReorderControl() {
if (self.reorderControl != nil) {
return;
}
for view in self.subviews {
if view.description.containsString("UITableViewCellReorderControl") {
self.reorderControl = view
}
}
if ((self.reorderControl) != nil)
{
let imageOfReorder = self.reorderControl?.subviews[0] as? UIImageView
imageOfReorder?.removeFromSuperview()
}
}
此時(shí)就完成了將拖動按鈕隱藏的功能,但是注意,在這里如果想通過設(shè)置reorderControl的frame去改變它的位置是不成功的,我想可能它的布局使用autolayout,并沒有深入的再去研究。
2. 在iOS的環(huán)境下使用正則表達(dá)式
在iOS下使用正則似乎挺麻煩的,如果只是想用正則判斷格式,那么可以使用NSPredicate:
let string = "abcd"
let predicate = NSPredicate.init(format: "self matches %@", "^a(b|c)d$")
predicate.evaluateWithObject(string)
如果要使用正則判斷格式,然后獲取group的子字符串,就比較麻煩了,并沒有Swift的原生方法來做,必須使用NSRegularExpression,話不多說,上代碼:
let reg = try! NSRegularExpression.init(pattern: "^a(b|c)d$", options: NSRegularExpressionOptions.CaseInsensitive)
let matches = reg.matchesInString(string, options: NSMatchingOptions.init(rawValue: 0), range: NSMakeRange(0, string.characters.count))
if matches?.count > 0 {
let returnString = (string as NSString).substringWithRange(matches![0].rangeAtIndex(1))
}
3. 如何優(yōu)雅的隱藏tabbar
很多APP都使用TabBarController套NavigationController的方法來作為應(yīng)用的框架,那么隱藏TabBar就成了一個必要的功能,目前最簡單的方法還是使用hidesBottomBarWhenPushed來實(shí)現(xiàn),最簡單的方法就是在要隱藏tab bar的Controller里寫入下面的方法,來覆默認(rèn)值。
- (BOOL) hidesBottomBarWhenPushed {
return (self.navigationController.topViewController == self);
}
4. 如何修改navigationbar的顏色
[self.navigationController.navigationBar setTranslucent:NO];
self.navigationController.navigationBar.barTintColor = [UIColor redColor];
//在此方法中還原顏色
-(void)viewWillDisappear:(BOOL)animated{
self.navigationController.navigationBar.barTintColor = [UIColor whiteColor];
[super viewWillDisappear:animated];
}
5. 運(yùn)行時(shí)修改使用autolayout的view
方案是運(yùn)行時(shí)給view添加constraint。
NSLayoutConstraint *c = [NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem: view2
attribute: NSLayoutAttributeTop
multiplier:1
constant:2];
view1(的頂部) = view2(的頂部) * 1 + 2
這個代碼的意思是把view1的頂部放在view2的頂部向下兩個像素的地方(因?yàn)榇藭r(shí)view1是view2 的subview,所以達(dá)到的效果就是view1在view2頂部向下2個像素的地方)
如下是所有屬性:
NSLayoutAttributeLeft? ? 視圖的左邊
NSLayoutAttributeRight? ? 視圖的右邊
NSLayoutAttributeTop? ? 視圖的上邊
NSLayoutAttributeBottom? ? 視圖的下邊
NSLayoutAttributeLeading? ? 視圖的前邊
NSLayoutAttributeTrailing? ? 視圖的后邊
NSLayoutAttributeWidth? ? 視圖的寬度
NSLayoutAttributeHeight? ? 視圖的高度
NSLayoutAttributeCenterX? ? 視圖的中點(diǎn)的X值
NSLayoutAttributeCenterY? ? 視圖中點(diǎn)的Y值
NSLayoutAttributeBaseline? ? 視圖的基準(zhǔn)線
NSLayoutAttributeNotAnAttribute? ? 無屬性
6. navigation controller子view偏移問題
場景是這樣的:頁面使用UItableview布局,由于頁面比較復(fù)雜,在push進(jìn)去再出來時(shí)第一個cell會向下偏移。解決方案:
//在viewDidLoad中加入:
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]){
self.edgesForExtendedLayout = UIRectEdgeNone;
}
7. CoreData的使用總結(jié)
//
//? CoreDataHelper.swift
//? TestCode
//
//? Created by lk on 16/7/6.
//? Copyright ? 2016年 lk. All rights reserved.
//
import Foundation
import CoreData
@objc class CoreDataHelper: NSObject {
static let KEY_OF_MAX_ORDER_NUMBER_OF_I = "MIK"
static let KEY_OF_MAX_ORDER_NUMBER_OF_O = "MOK"
var context : NSManagedObjectContext!
static let sharedInstance = CoreDataHelper()
private func fetchQuery(request request : NSFetchRequest) -> [NSManagedObject] {
do{
let fetchResults = try context?.executeFetchRequest(request) as! [NSManagedObject]!
return fetchResults
}catch let error as NSError {
print("查詢失敗: \\(error)")
}
return []
}
private func save() -> Void {
//保存
do{
try context.save()
} catch let error as NSError {
print("保存失敗: \\(error)")
}
}
//TODO: - 這里可能存在溢出漏洞,以后再說
private func addIncrement(key _key : String, newNumber : Int) -> Void {
if _key == CoreDataHelper. KEY_OF_MAX_ORDER_NUMBER_OF_O || _key == CoreDataHelper.KEY_OF_MAX_ORDER_NUMBER_OF_I {
NSUserDefaults.standardUserDefaults().setInteger(newNumber, forKey: _key)
}
}
//Mark: - 重新計(jì)算最大值
func recaculateOptionalMaxOrder() -> Void {
let topOptinal = getOptionals(count: 1)
if topOptinal.count > 0 {
NSUserDefaults.standardUserDefaults().setInteger(topOptinal[0].order!.integerValue, forKey: CoreDataHelper.KEY_OF_MAX_ORDER_NUMBER_OF_O)
}
}
//MARK: - 添加
func addXXX(code code: String, name: String) -> Void {
if (context == nil) {
print("添加失敗,context為nil")
return
}
let s = NSEntityDescription.insertNewObjectForEntityForName("S", inManagedObjectContext: context) as! S
//對象賦值
s.code = code
s.name = name
s.numericalCode = info.code
s.type = info.type
save()
}
//MARK: - 刪除
func removeAll() -> Void {
let fetchRequest = NSFetchRequest(entityName: "S")
let fetchResults = fetchQuery(request: fetchRequest)
for info:NSManagedObject in fetchResults {
//刪除對象
context.deleteObject(info)
}
save()
}
//MARK: - 查詢
func getObject(code code : String) -> S? {
if (context == nil) {
print("查詢失敗,context為nil")
return nil;
}
let fetchRequest = NSFetchRequest(entityName: "S")
let predicate = NSPredicate(format: "code == %@ || numericalCode == %@", code, code)
fetchRequest.predicate = predicate
let fetchResults = fetchQuery(request: fetchRequest)
if let ses = fetchResults as? [S] {
if ses.count > 0{
return ses[0]
}else{
return nil
}
}
return nil
}
//MARK: - 搜索
func searchStocks(filterString : String) -> [Stock] {
var attribute = "code";
let num = Int(filterString)
if filterString.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) <= 0 {
return []
} else if num == nil {
//TODO
attribute = "name"
}
let fetchRequest = NSFetchRequest(entityName: "S")
fetchRequest.predicate = NSPredicate.init(format: "%K CONTAINS %@", attribute, filterString)
let fetchResults = fetchQuery(request: fetchRequest)
print("結(jié)果:")
print(fetchResults)
var ses = [S]()
for res in fetchResults {
let s = res as! S
ses.append(s)
}
return ses
}