|
CÊÇÈí¼þ¹¤³ÌÖеÄÒ»ÖÖÈí¼þ¼Ü¹¹Ä£Ê½£¬Ëü°ÑÈí¼þϵͳ·ÖΪÈý¸ö»ù±¾µÄ²¿·Ö£ºÄ£ÐÍModel¡¢ÊÓͼViewÒÔ¼°¿ØÖÆÆ÷Controller¡£ÕâÖÖģʽµÄÄ¿µÄÊÇΪÁËʵÏÖÒ»ÖÖ¶¯Ì¬µÄ³ÌÐòÉè¼Æ£¬¼ò»¯ºóÐø¶ÔÈí¼þϵͳµÄÐ޸ĺÍÀ©Õ¹£¬²¢Ê¹µÃ³ÌÐòµÄijһ²¿·ÖµÄ¸´ÓóÉΪ¿ÉÄÜ¡£Èý¸ö²¿·Ö°´ÕÕÆä¸÷×ÔµÄÖ°Ôð»®·Ö£º
Êý¾ÝModel£º ¸ºÔð·â×°Êý¾Ý¡¢´æ´¢ºÍ´¦ÀíÊý¾ÝÔËËãµÈ¹¤×÷
ÊÓͼView£º ¸ºÔðÊý¾Ýչʾ¡¢¼àÌýÓû§´¥ÃþµÈ¹¤×÷
¿ØÖÆÆ÷Controller£º ¸ºÔðÒµÎñÂß¼¡¢Ê¼þÏìÓ¦¡¢Êý¾Ý¼Ó¹¤µÈ¹¤×÷
ÔÚ´«Í³µÄMVC½á¹¹ÖУ¬Êý¾Ý²ãÔÚ·¢Éú¸Ä±äÖ®ºó»á֪ͨÊÓͼ²ã½øÐжÔÓ¦µÄ´¦Àí£¬ÊÓͼ²ãÄÜÖ±½Ó·ÃÎÊÊý¾Ý²ã¡£µ«ÔÚiOSÖУ¬MºÍVÖ®¼ä½ûֹͨÐÅ£¬±ØÐëÓÉC¿ØÖÆÆ÷²ãÀ´Ðµ÷MºÍVÖ®¼äµÄ±ä»¯¡£ÈçÏÂͼËùʾ£¬C¶ÔMºÍVµÄ·ÃÎÊÊDz»ÊÜÏ޵쬵«MºÍV²»ÔÊÐíÖ±½Ó½Ó´¥¿ØÖÆÆ÷²ã£¬¶øÊÇÓɶàÖÖCallbacks·½Ê½À´Í¨Öª¿ØÖÆÆ÷

±¾ÎÄÖ¼ÔÚ×ܽá¹éÄɱÊÕß×Ô¼ºÔÚ¿ª·¢¹ý³ÌÖжÔÓڼܹ¹Éè¼ÆµÄÀí½â£¬Ë³´øÒ»Ð©±ÊÕß¶Ô¿ØÖÆÆ÷´úÂëÊÝÉíµÄ×ܽᡣ
ÔÚ´ËÉùÃ÷£¬ÒÔÏÂÎÄÕµĹ۵ãΪ¸öÈ˹۵㣬Èç¹ûÄã¾õµÃ±ÊÕßµÄ¹Ûµã´æÔÚÎÊÌ⣬»¶ÓÔÚÌÖÂÛÇø½»Á÷¡£
ÈçºÎ·Ö²ã
MVCÊÇiOS¿ª·¢Õß×î³£ÓõĿò¼Ü½á¹¹£¬¼´±ãÊÇÔ½À´Ô½ÈÈÃŵÄMVVM»òÊÇÆäËû¿ò¼Ü½á¹¹£¬¼¸ºõ¶¼ÊÇ»ùÓÚMVCģʽ϶Ը÷¸ö×é¿éµÄÖ°Ôð½øÒ»²½µÄϸ»¯·Ö²ã°ÕÁË¡£ÄÇô£¬ÔÚ¿ª·¢µÄʱºòÈçºÎÖÆ¶¨Èý²¿·ÖµÄ²ã´Î»®·ÖÄØ£¿»ù±¾ÉÏËùÓеÄÓ¦ÓÃÎ޷Ƕ¼ÊÇÔÚ×öÕâЩÊÂÇ飺

ËäÈ»ÉÏͼ²»ÄÜÄÒÀ¨ËùÓеÄÓ¦Ó㬵«ÊÇ»ù±¾¶øÑÔ´óÖÚ¿ª·¢Õ߸ɵĻî¾ÍÊÇÕâЩÁË¡£¼òµ¥µÄ¸ù¾ÝÕâЩÊÂÇéÀ´·Ö¹¤£¬ÎÒÃÇ¿ÉÒԺܿìµÄµÃ³öMVCºÍ¹¤×÷ÄÚÈݵĶÔÓ¦¹ØÏµ£º
controller <--> ÍøÂçÇëÇó¡¢Ê¼þÏìÓ¦
view <--> Êý¾Ýչʾ¡¢¶¯Ð§Õ¹Ê¾
model <--> Êý¾Ý´¦Àí
ͨ¹ý¶ÔÎÒÃÇ¿ª·¢¹¤×÷µÄ·Ö¹¤£¬MVC¼Ü¹¹µÄ´úÂë·Ö²ã¼¸ºõÒѾ¿ÉÒÔÈ·¶¨ÁË£¬ÏÂÃæ±ÊÕß»á¶ÔÕâÈý²¿·Ö½øÐиüÏêϸµÄ½²Êö
Ä£ÐÍModelÓ¦¸Ã·Åʲô´úÂë
ÔÚÒÔÍù¿ª·¢ÖУ¬¶ÔÓÚÄ£ÐͲã±ÊÕß´æÔÚÕâô¼¸¸öÒÉ»ó£º
Ä£ÐÍModelÖ»ÊÇÒ»¸ö´¿´âµÄÊý¾Ý½á¹¹
¸ºÔðÊý¾ÝI/O²Ù×÷µÄ²Ù×÷ÊôÓÚC»¹ÊÇM
µÚÒ»¸öÎÊÌâ±ÊÕßÈÏΪÔÒòÔÚÓÚÈÏÖª´íÎ󣬹ýÍù¿ª·¢µÄ¹ý³ÌÖУ¬±ÊÕßÔø¾Ò»¶ÈÈÏΪÊý¾ÝºÍÄ£ÐÍÖ®¼äµÄת»»ÊôÓÚÒµÎñ²Ù×÷£¬½«ÕâЩ´¦Àí·ÅÔÚ¿ØÖÆÆ÷Controller²ãÖÐÖ´ÐУº
- (void)analyseRequestJSON: (NSDictionary *)JSON { NSArray *modelsData = JSON[@"result"]; NSMutableArray *models = @[].mutableCopy;
for (NSDictionary *data in modelsData) {
LXDRecord *record = [[LXDRecord alloc] init];
record.content = data[@"content"];
record.recorder = data[@"recorder"];
record.createDate = data[@"createDate"];
record.updateDate = data[@"updateDate"];
[models addObject: record];
}
} |
ÕâÊǵäÐ͵ÄÈÏÖª´íÎóÒý·¢µÄ´úÂë´íÎó·ÅÖõĴíÎ󣬶ÔÓÚÕâÖÖÇé¿ö£¬Ö±½Ó³£¼ûµÄ×ö·¨ÊÇÔÚModelÖÐÖ±½Ó¼ÓÈëÈ«Äܹ¹ÔìÆ÷Designed
InitializerÀ´½«Õⲿ·Ö´úÂë×ªÒÆÖÁModelÖУº
@interface LXDRecord: NSObject //properties - (instancetype)initWithCreateDate: (NSString *)createDate updateDate: (NSString *)updateDate content: (NSString *)content recorder: (NSString *)recorder; @end
//Controller
- (void)analyseRequestJSON: (NSDictionary *)JSON
{
NSArray *modelsData = JSON[@"result"];
NSMutableArray *models = @[].mutableCopy;
for (NSDictionary *data in modelsData) {
LXDRecord *record = [[LXDRecord alloc] initWithCreateDate:
data[@"createDate"]
updateDate: data[@"updateDate"]
content: data[@"content"]
recorder: data[@"recorder"]];
[models addObject: record];
}
} |
ÔÚ×ªÒÆÊý¾Ý->Ä£ÐÍÕâÒ»Âß¼´¦ÀíÖ®ºóÊý¾Ý²ãÏà¶Ô¶øÑԾͳäʵµÄ¶à£¬µ«Õ⻹²»¹»¡£Êý¾ÝÔÚÍê³É³éÏóת»»µÄ¹¤×÷Ö®ºó£¬Í¨³£ÒªÕ¹Ê¾µ½ÊÓͼ²ãÃæÉÏ¡£µ«ÍùÍùÄ£ÐÍ»¹ÐèÒª½øÐжîÍâµÄ¼Ó¹¤²ÅÄÜչʾ£¬±ÈÈç±ÊÕßÔø¾ÏîÄ¿ÖеÄÒ»¸öÐèÇó£ºÓû§ÔÚ½ÉÄÉ¿í´ø·ÑÓÃºó½«¿í´ø°ìÀíÆÚ¼äÏÔʾ³öÀ´£¬ÕâÐèÇó½¨Á¢ÔÚ·þÎñÆ÷Ö»ÓаìÀíʱ¼äºÍ°ìÀíʱ³¤Á½¸ö×ֶΡ£ÔÚMVCµÄ½á¹¹Ï£¬½«Õⲿ·Ö´úÂë·ÅÔÚC²ã»áµ¼Ö´úÂë¹ý¶à¹ýÓÚÔÓÂҵĺó¹û£¬Òò´Ë±ÊÕß½«Æä·ÅÔÚModelÖУº
@interface YQBNetworkRecord: YQBModel
@property (nonatomic, copy, readonly) NSString
*dealDate; //°ìÀíʱ¼ä
@property (nonatomic, copy, readonly) NSString
*effectTime; //°ìÀíʱ³¤
- (NSString *)timeOfNetworkDuration;
@end
@implementation YQBNetworkRecord
- (NSString *)timeOfNetworkDuration {
NSTimeInterval effectInterval = [_effectTime stringToInterval];
return [_dealDate stringByAppendString: [_dealDate
dateAfterInterval: effectInterval]];
}
@end |
ÕâÒ»×ö·¨½«Ò»²¿·ÖC ²ã´ÎµÄÂß¼·Åµ½ÁËMÖУ¬ÓÉÓÚÕâÒ»²¿·ÖµÄÂß¼ÊôÓÚÈõÒµÎñ£¬ÊôÓÚ¼¸ºõ²»»á¸Ä¶¯µÄÒµÎñÂß¼£¬Òò´Ë²¢²»»áÓ°ÏìMVCµÄÕûÌå½á¹¹¡£µ«Í¬ÑùÒ²´æÔÚ×Å·çÏÕ£º
´úÂëÒÀÀµÓÚModelµÄ²îÒ컯£¬¸´ÓÃÐÔµÍ
´úÂëÁ¿È¡¾öÓÚModelµÄÊýÁ¿£¬ÈÝÒ×µ¼ÖÂÅÖModelµÄÇé¿ö
ËäÈ»´æÔÚ×ÅÕâЩ²»×㣬µ«ÊÇÈç¹ûÊÇÔÚMVCģʽ϶ԿØÖÆÆ÷½øÐмõ¸ºµÄÇé¿öÏ£¬ÕâÖÖ×ö·¨¼òµ¥ÓÐЧ¡£ÁíÍ⣬ʹÓÃcategory½«ÕâЩÂß¼´úÂë·ÖÀë³öÈ¥¿ÉÒÔʹµÃ¸´ÓÃÐÔ±äµÃ²»ÄÇôµÄÔã¡£µ±È»ÉÏÃæµÄÊý¾Ý->Ä£Ð͹ý³ÌÖÐÒ²´æÔÚ×ÅÒòΪÊý¾ÝÀàÐͱ仯¶øµ¼Ö¹¹ÔìÆ÷ʧЧµÄÎÊÌ⣬Õâʱºò²Î¿¼YYModelµÄ×ö·¨¿ÉÒÔ¼õÉÙ»òÕß½â¾öÕâЩÎÊÌâµÄ·¢Éú
I/O²Ù×÷
Ê×ÏÈÊÇI/O²Ù×÷µÄÒµÎñ¹éÊôÎÊÌâ¡£¼ÙÉèÎÒÃǵÄM²ÉÓÃÁËÐòÁй鵵µÄ³Ö¾Ã»¯·½°¸£¬ÄÇôM²ãÓ¦¸ÃʵÏÖNSCodingÐÒ飺
@interface LXDRecord: NSObject<NSCoding> @end
@implementation LXDRecord
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject: _content forKey: @"content"];
[aCoder encodeObject: _recorder forKey: @"recorder"];
[aCoder encodeObject: _createDate forKey: @"createDate"];
[aCoder encodeObject: _updateDate forKey: @"updateDate"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init]) {
_content = [aDecoder decodeObjectForKey: @"content"];
_recorder = [aDecoder decodeObjectForKey: @"recorder"];
_createDate = [aDecoder decodeObjectForKey: @"createDate"];
_updateDate = [aDecoder decodeObjectForKey: @"updateDate"];
}
return self;
}
@end |
´ÓÐòÁл¯¹éµµµÄʵÏÖÖÐÎÒÃÇ¿ÉÒÔ¿´µ½ÕâЩºËÐÄ´úÂëÊÇ·ÅÔÚÄ£ÐͲãÖÐʵÏֵģ¬ËäÈ»»¹Òª½èÖúNSKeyedArchiverÀ´Íê³É´æÈ¡²Ù×÷£¬µ«ÊÇÔÚÕâЩʵÏÖÉϽ«I/O²Ù×÷¹éÊôΪM²ãµÄÒµÎñÒ²ËãµÄÉÏ·ûºÏÇéÀí¡£ÁíÒ»·½Ã棬ºÏÀíµÄ½«ÕâÒ»ÒµÎñ·Åµ½Ä£ÐͲãÖмȼõÉÙÁË¿ØÖÆÆ÷²ãµÄ´úÂëÁ¿£¬Ò²ÈÃÄ£ÐͲ㲻½ö½öÊÇ»¨Æ¿½ÇÉ«¡£Í¨³£Çé¿öÏ£¬ÎÒÃǵÄI/O²Ù×÷²»»áÖ±½Ó·ÅÔÚ¿ØÖÆÆ÷µÄ´úÂëÖУ¬¶øÊǻὫÕⲿ·Ö²Ù×÷·â×°³ÉÒ»¸öÊý¾Ý¿â¹ÜÀíÕßÀ´Ö´ÐУº
@interface LXDDataManager: NSObject
+ (instancetype)sharedManager;
- (void)insertData: (LXDRecord *)record;
- (NSArray<LXDRecord *> *)storedRecord;
@end |
ÕâÊÇÒ»¶Î·Ç³£³£¼ûµÄÊý¾Ý¿â¹ÜÀíÕߵĴúÂ룬ȱµãÊÇÏÔ¶øÒ×¼ûµÄ£ºI/O²Ù×÷µÄÒµÎñʵÏÖ¶ÔÏó¹ýÓÚÒÀÀµÊý¾ÝÄ£Ð͵Ľṹ£¬ÕâʹµÃÕⲿ·ÖÒµÎñ¼¸ºõ²»¿É¸´Ó㬽öÄÜ·þÎñÖ¸¶¨µÄÊý¾ÝÄ£ÐÍ¡£½â¾öµÄ·½°¸Ö®Ò»²ÉÓÃÊý¾Ý¿â¹Ø¼ü×Ö<->ÊôÐÔ±äÁ¿ÃûÓ³ÉäµÄ·½Ê½´«ÈëÓ³Éä×ֵ䣺
@interface LXDDataManager: NSObject
+ (instancetype)managerWithTableName: (NSString
*)tableName;
- (void)insertData: (id)dataObject mapper: (NSDictionary
*)mapper;
@end
@implementation LXDDataManager
- (void)insertData: (id)dataObject mapper: (NSDictionary
*)mapper {
NSMutableString * insertSql = [NSMutableString
stringWithFormat: @"insert into %@ (",
_tableName];
NSMutableArray * keys = @[].mutableCopy;
NSMutableArray * values = @[].mutableCopy;
NSMutableArray * valueSql = @[].mutableCopy;
for (NSString * key in mapper) {
[keys addObject: key];
[values addObject: ([dataObject valueForKey: key]
?: [NSNull null])];
[valueSql addObject: @"?"];
}
[insertSql appendString: [keys componentsJoinedByString:
@","];
[insertSql appendString @") values ("];
[insertSql appendString: [valueSql componentsJoinedByString:
@","];
[insertSql appendString: @")"];
[_database executeUpdate: insertSql withArgumentsInArray:
values];
}
@end |
ͨ¹ý¼üÖµ¶ÔÓ³ÉäµÄ·½Ê½ÈÃÊý¾Ý¹ÜÀíÕß¿ÉÒÔ¶¯Ì¬µÄ²åÈ벻ͬµÄÊý¾ÝÄ£ÐÍ£¬ÕâÑù¿ÉÒÔ¼õÉÙI/O²Ù×÷ÒµÎñÖжÔÊý¾ÝÄ£ÐͽṹµÄÒÀÀµ£¬Ê¹µÃÆä¸üÒ×Ó᣸ü½øÒ»²½»¹¿ÉÒÔ½«Õâ¶Î´úÂëÖÐmapperµÄÓ³ÉäÈÎÎñ·ÖÀë³öÀ´£¬Í¨¹ýÉùÃ÷Ò»¸öÓ³ÉäÐÒéÀ´Íê³ÉÕâÒ»¹¤×÷£º
@protocol LXDModelMapper <NSObject>
- (NSArray<NSString *> *)insertKeys;
- (NSArray *)insertValues;
@end
@interface LXDDataManager: NSObject
+ (instancetype)managerWithTableName: (NSString
*)tableName;
- (void)insertData: (id<LXDModelMapper>)dataObject;
@end
@implementation LXDDataManager
- (void)insertData: (id<LXDModelMapper>)dataObject
mapper: (NSDictionary *)mapper {
NSMutableString * insertSql = [NSMutableString
stringWithFormat: @"insert into %@ (",
_tableName];
NSMutableArray * keys = [dataObject insertKeys];
NSMutableArray * valueSql = @[].mutableCopy;
for (NSInteger idx = 0; idx < keys.count;
idx++) {
[valueSql addObject: @"?"];
}
[insertSql appendString: [keys componentsJoinedByString:
@","];
[insertSql appendString @") values ("];
[insertSql appendString: [valueSql componentsJoinedByString:
@","];
[insertSql appendString: @")"];
[_database executeUpdate: insertSql withArgumentsInArray:
[dataObject insertValues]];
}
@end |
½«ÕâЩÂß¼·ÖÀë³ÉÐÒéÀ´ÊµÏֵĺô¦°üÀ¨£º
ÒÆ³ýÁËI/OÒµÎñÖв»±ØÒªµÄÂß¼£¬ÇÖÈëÐÔ¸üµÍ
Èÿª·¢ÕßʵÏÖÐÒé·µ»ØµÄÊý¾ÝÅÅÐò»á¸ü¶ÔÆë
À©Õ¹Ö§³ÖI/O²Ù×÷µÄÊý¾ÝÄ£ÐÍ
×ܽáÒ»ÏÂM²ã¿ÉÒÔ×öµÄÊÂÇ飺
Ìṩ½Ó¿ÚÀ´ÌṩÊý¾Ý->չʾÄÚÈݵÄʵÏÖ£¬¾¡¿ÉÄÜÒÔcategoryµÄ·½Ê½Íê³É
¶ÔÓÚM²ãͳһµÄÒµÎñ±ÈÈç´æÈ¡¿ÉÒÔÒÔÐÒéʵÏֵķ½Ê½ÌṩËùÐèÐÅÏ¢
ÊÓͼ²ãµÄSelf-Manager
ͨ³£Çé¿öÏ£¬ÊÓͼ²ãÖ»ÊǼòµ¥¸ºÔðÊý¾ÝչʾºÍ¸ºÔð½«Ê¼þÏìӦת½»¸ø¿ØÖÆÆ÷C²ãÖ´ÐУ¬´´½¨ÊÓͼµÄ´úÂë¶¼ÔÚ¿ØÖÆÆ÷²ãÖÐÍê³É£¬Òò´ËV²ãµÄ״̬Ҳ²»¼ûµÃ±ÈMºÃµÃ¶à¡£±ÈÈçµ±ÎÒ×Ô¶¨ÒåÒ»¸öÉÈÐÎÕ¹¿ªµÄ²Ëµ¥ÊÓͼ£¬ÔÚµã»÷ʱµÄÏìÓ¦£º
/LXDMenuView.m - (void)clickMenuItem: (LXDMenuItem *)menuItem { if ([_delegate respondsToSelector: @selector(menuView:didSelectedItem:)]) { [_delegate menuView: self didSelectedItem: menuItem.tag]; } }
//ViewController.m
- (void)menuView: (LXDMenuView *)menuView didSelectedItem:
(NSInteger)index {
Class controllerCls = NSClassFromString(_controllerNames[index]);
UIViewController *nextController = [[controllerCls
alloc] init];
[self.navigationController pushViewController:
nextController animated: YES];
} |
Õâ¶Î´úÂëÊÇ×î³£¼ûµÄÊÓͼ->¿ØÖÆÆ÷ʼþ´¦ÀíÁ÷³Ì£¬µ±Ò»¸ö¿ØÖÆÆ÷½çÃæµÄ×Ô¶¨ÒåÊÓͼ¡¢¿Ø¼þÏìӦʼþ¹ý¶àµÄʱºò£¬¼´±ãÎÒÃÇÒѾʹÓÃ#pragma
mark -µÄ·½Ê½½«ÕâЩʼþ½øÐзֶΣ¬µ«»¹ÊÇ»áÕ¼Óùý´óµÄ´úÂëÁ¿¡£MVC¹«ÈϵÄÎÊÌâÊÇCÍê³ÉÁËÌ«¶àµÄÒµÎñÂß¼£¬µ¼Ö¹ýÅÖ£¬¸úM²ãµÄ´¦ÀíÒ»ÑùµÄ£¬±ÊÕßͬÑù½«Ò»²¿·ÖÈõÒµÎñ×ªÒÆµ½V²ãÉÏ£¬±ÈÈçÉÏÃæµÄÕâ¶ÎÒ³ÃæÌø×ª£º
@interface LXDMenuView: UIView
@property (nonatomic, strong) NSArray<NSString
*> * itemControllerNames;
@end
@implementation LXDMenuView
- (void)clickMenuItem: (LXDMenuItem *)menuItem
{
UIViewController *currentController = [self currentController];
if (currentController == nil) { return; }
Class controllerCls = NSClassFromString(_itemControllerNames[menuItem.tag]);
UIViewController *nextController = [[controllerCls
alloc] init];
if ([currentController respondsToSelector: @selector(menuView:transitionToController:)])
{
[currentController menuView: self transitionToController:
nextController];
}
[currentController.navigationController pushViewController:
nextController animated: YES];
}
- (UIViewController *)currentController {
UIResponder *nextResponder = self.nextResponder;
while (![nextResponder isKindOfClass: [UIWindow
class]]) {
if ([nextResponder isKindOfClass: [UIViewController
class]]) {
return (UIViewController *)nextResponder;
}
nextResponder = nextResponder.nextResponder;
}
return nil;
}
@end |
ÕâÖÖÒµÎñ×ªÒÆµÄ˼·À´×ÔÓÚ¿ª·¢ÖеÄSelf-ManagerģʽһÎÄ¡£ÔÚÕâÖÖ´úÂë½á¹¹ÖУ¬Èç¹ûV²ã¾ö¶¨ÁË¿ØÖÆÆ÷½ÓÏÂÀ´µÄÌø×ª£¬ÄÇô¿ÉÒÔ¿¼Âǽ«Ìø×ªµÄÒµÎñÇ¨ÒÆµ½VÖÐÖ´ÐС£Í¨¹ýʼþÁ´²éÕҵķ½Ê½»ñÈ¡ËùÔڵĿØÖÆÆ÷£¬ÕâÒ»¹ý³Ì²¢²»ÄÜ˵Υ±³ÁËMVCµÄ·ÃÎÊÏÞÖÆÔÔò£¬ÔÚÕû¸ö¹ý³ÌÖÐV²»ÔÚºõÆäËùÔÚµÄcurrentControllerºÍnextControllerµÄ¾ßÌåÀàÐÍ£¬Í¨¹ý×Ô¶¨ÒåÒ»¸öÐÒéÀ´ÔÚÌø×ªÇ°½«nextController·¢Ë͸øµ±Ç°¿ØÖÆÆ÷Íê³ÉÌø×ªÇ°µÄÅäÖá£
ÕâÀïҪעÒâµÄÊÇ£¬Self-ManagerÓÐÆäÌØ¶¨µÄʹÓó¡¾°¡£µ±ÊÓͼ²ãµÄ»Øµ÷´¦ÀíÐèÒªÁ½²ã»òÕ߸ü¶àµÄʱºò£¬Self-ManagerÄÜÓÐЧµÄÖ´ÐÐ
Èç¹û³éÀëµÄ×ã¹»¸ß¼¶£¬ÉõÖÁ¿ÉÒÔ¶¨ÒåÒ»¸öͬһ¸öµÄSelf-ManagerÐÒéÀ´Ìṩ¸ø×Ô¶¨ÒåÊÓͼÍê³ÉÕâЩ¹¤×÷¡£ÕâÑùͬһÌ×ÒµÎñÂß¼¿ÉÒÔ¸øÈÎÒâµÄ×Ô¶¨ÒåÊÓͼ¸´Óã¬Ö»ÒªÆä·ûºÏÊÓͼ<->¿ØÖÆÆ÷µÄÀ¦°ó¹ØÏµ¡££º
@protocol LXDViewSelfManager <NSObject>
@optional
- (void)customView: (UIView *)customView transitionToController:
(UIViewController *)nextController;
@end |
ÊÓͼ²ãµÄ¶¯»Ð§¹û
¶¯»ÊµÏÖÒ²ÊÇÊôÓÚV²¿·ÖµÄÂß¼£¬ÕâµãµÄÀíÓÉÓÐÕâôÁ½¸ö£º
¶¯»ÊµÏÖºÍÑÝʾÊÓͼ´æÔÚÒÀÀµ¹ØÏµ
½«¶¯»ÊµÏַŵ½ÊÓͼ²ã¿ÉÒÔʵÏÖ¶¯Ð§ÊÓͼµÄ¸´ÓÃ
»°ÊÇÕâô˵£¬µ«ÊÇÔÚÐí¶àµÄÏîÄ¿ÖУ¬ÕâÑùµÄ´úÂë±È±È½ÔÊÇ£º
@implementation ViewController: UIViewController
//µ¯´°¶¯»Ð§¹û
- (void)animatedAlertView {
AlertView *alert = [[AlertView alloc] initWithMessage:
@"ÕâÊÇÒ»Ìõµ¯´°¾¯¸æÐÅÏ¢"];
alert.alpha = 0;
alert.center = self.view.center;
alert.transform = CGAffineTransformMakeScale(0.01,
0.01);
[UIView animateWithDuration: 0.25 animations:
^{
alert.alpha = 1;
alert.transform = CGAffineTransformIdentity;
}];
}
@end |
¾ßÌåµÄ²Ûµã±ÊÕ߾Ͳ»ÍÂÁË£¬¶ÔÓÚ¶¯»ÊµÏÖ±ÊÕßÖ»ÓÐÒ»¸ö½¨Ò飺ÎÞÂÛÄãҪʵÏֵ͝»¶àô¼òµ¥£¬Í³Ò»ÈÓµ½ViewÖÐȥʵÏÖ£¬Ìṩ½Ó¿Ú¸øC²ãµ÷ÓÃչʾ¡£ÒªÖªµÀ£¬±¥ÊÜ¿ª·¢ÕßͲ۵ÄUIAlertViewÔÚµ¯´°Ð§¹ûÉϵĽӿڼò½àµÄÌô²»³ö벡£¬½ö½öÒ»¸ö-
(void)show¾ÍÍê³ÉÁËÖÚ¶àµÄ¶¯»Ð§¹û¡£Èç¹ûÄ㲻ϲ»¶ÒòΪ¶¯»Ð§¹û¾ÍÒª×Ô¶¨ÒåÊÓͼ£¬ÄÇô½«³£Óõ͝»Ð§¹ûÒÔcategoryµÄ·½Ê½À©Õ¹³öÀ´Ê¹Óãº
@interface UIView (Animation)
- (void)pop;
@end
@implementation UIView (Animation)
- (void)pop {
CGPoint center = CGPointMake(self.superView.frame.size.width
/ 2, self.superView.frame.size.height / 2);
self.center = center;
self.alpha = 0;
self.transform = CGAffineTransformMakeScale(0.01,
0.01);
[UIView animateWithDuration: 0.25 animations:
^{
self.alpha = 1;
self.transform = CGAffineTransformIdentity;
}];
}
@end |
ÊÝÉíController
MVCÖÐ×î´óµÄÎÊÌâÔÚÓÚC²ã¸ºµ£ÁËÌ«¶àµÄÒµÎñ£¬ËùÒÔµ¼ÖÂController¹ý´ó¡£ÄÇô½«Ò»Ð©²»ÊôÓÚµÄControllerÒµÎñµÄÂß¼·ÖÀëµ½ÆäËû²ãÖÐÊÇÖ÷ÒªµÄ½â¾ö˼·¡£iOSµÄMVCģʽҲ±»³Æ×÷ÖØ¿ØÖÆÆ÷ģʽ£¬ÕâÊÇÔÚʵ¼Ê¿ª·¢ÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½VºÍCÄÑÒÔÏ໥¶ÀÁ¢£¬ÕâÁ½²¿·Ö×ÜÊǽô½ôµÄÕ³ºÏÔÚÒ»ÆðµÄ£º

ÔÚiOSÖУ¬Controller¹ÜÀí×Å×Ô¼ºµÄÊÓͼµÄÉúÃüÖÜÆÚ£¬Òò´Ë»áºÍÕâ¸öÊÓͼ±¾Éí²úÉú½Ï´óµÄñîºÏ¹ØÏµ¡£ÕâÖÖñîºÏ×î´óµÄ±íÏÖÔÚÓÚÎÒÃǵÄV×ÜÊǼ¸ºõÔÚCÖд´½¨µÄ£¬ÉúÃüÖÜÆÚÓÉC²ãÀ´¸ºÔð£¬ËùÒÔ¶ÔÓÚÏÂÃæÕâÖÖÊÓͼ´´½¨´úÂëÎÒÃDz¢²»»á¾õµÃÓÐʲôÎÊÌ⣺
//ViewController.m - (void)viewDidLoad { [super viewDidLoad]; UIButton *btn = [[UIButton alloc] initWithFrame: CGRectMake(20, 60, self.view.bounds.size.width - 40, 45)]; [btn setTitle: @"µã»÷" forState: UIControlStateNormal]; [btn addTarget: self action: @selector(clickButton:) forControlEvents: UIControlEventTouchUpInside]; [self.view addSubview: btn]; } |
µ«Êǰ´ÕÕÒµÎñÂß¼À´Ëµ£¬ÎÒÃÇ¿ÉÒÔÔÚControllerÀïÃæ´´½¨ÊÓͼ£¬µ«ÊÇÅäÖõÄÈÎÎñ²»Ó¦¸ÃÇáÒ׵ķÅÔÚC²ã¡£Òò´Ë£¬ÕâЩ´´½¨¹¤×÷ÍêÈ«¿ÉÒÔʹÓÃÊÓͼµÄcategoryÀ´ÊµÏÖÅäÖÃÒµÎñ£¬¶ÔÓÚ³£ÓõĿؼþÄã¶¼¿ÉÒÔ³¢ÊÔ·â×°Ò»Ì×¹¹ÔìÆ÷À´¼õÉÙControllerÖеĴúÂ룺
@interface UIButton(LXDDesignedInitializer)
+ (instancetype)buttonWithFrame: (CGRect)frame
text: (NSString *)text;
+ (instancetype)buttonWithFrame: (CGRect)frame
text: (NSString *)text textColor: (UIColor *)textColor;
+ (instancetype)buttonWithFrame: (CGRect)frame
text: (NSString *)text textColor: (UIColor *)textColor
fontSize: (CGFloat)fontSize target: (id)target
action: (SEL)action;
+ (instancetype)buttonWithFrame: (CGRect)frame
text: (NSString *)text textColor: (UIColor *)textColor
fontSize: (CGFloat)fontSize cornerRadius: (CGFloat)cornerRadius;
+ (instancetype)buttonWithFrame: (CGRect)frame
text: (NSString *)text textColor: (UIColor *)textColor
fontSize: (CGFloat)fontSize cornerRadius: (CGFloat)cornerRadius
target: (id)target action: (SEL)action backgroundColor:
(UIColor *)backgroundColor;
+ (instancetype)buttonWithFrame:(CGRect)frame
text:(NSString *)text textColor:(UIColor *)textColor
fontSize: (CGFloat)fontSize cornerRadius: (CGFloat)cornerRadius
target: (id)target action: (SEL)action image:
(NSString *)image selectedImage: (NSString *)selectedImage
backgroundColor: (UIColor *)backgroundColor;
@end |
´ËÍ⣬Èç¹ûÎÒÃÇÐèҪʹÓôúÂëÉèÖÃÊÓͼµÄÔ¼ÊøÊ±£¬Masonry´ó¸ÅÊǼõÉÙÕâЩ´úÂëµÄ×îÓÅÑ¡Ôñ¡£ÊÓͼÅäÖôúÂëÊÇÎÒÃÇÊÝÉíControllerµÄÒ»²¿·Ö£¬Æä´ÎÔÚÓÚ´óÁ¿µÄ´úÀíÐÒé·½·¨¡£Òò´Ë£¬Ê¹ÓÃcategory½«´úÀí·½·¨ÊµÏÖÒÆµ½ÁíÍâµÄÎļþÖÐÊÇÒ»¸öºÃ·½·¨£º
@interface ViewController (LXDDelegateExtension) <UITableViewDelegate, UITableViewDataSource>
@end
@implementation ViewController(LXDDelegateExtension)
- (UITableViewCell *)tableView:(UITableView *) tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//configurate and return cell
}
- (NSInteger)tableView:(UITableView *) tableView
numberOfRowsInSection:(NSInteger)section
{
//return rows in section of cell number
}
@end |
ÕâÖÖ·½Ê½¼òµ¥µÄ°Ñ´úÀí·½·¨Å²ÒƵ½categoryµ±ÖУ¬µ«ÊÇÒ²´æÔÚ×ÅһЩȱµã£¬Òò´ËÊÊÓó¡ºÏ»á±È½Ï¾ÖÏÞ£º
ÔÚcategoryÖв»ÄÜ·ÃÎÊÔÀàµÄ˽ÓÐÊôÐÔ¡¢·½·¨¡£ÕâµãSwiftÒª³¬³öOCÌ«¶à
ÔÚ¼õÉÙÔÀàµÄ´úÂëÁ¿µÄÇé¿öÏÂʵ¼ÊÉÏʹµÃÕû¸öÏîÄ¿½á¹¹¶ÁÆðÀ´¸ü¼Ó¸´ÔÓ
±ÊÕßÔÚͨ¹ýÉÏÊöµÄ·½Ê½·ÖÀë´úÂëÖ®ºó£¬¿ØÖÆÆ÷²ãµÄ´úÂëÁ¿»ù±¾¿ÉÒԵõ½¿ØÖÆ¡£µ±È»£¬³ýÁËÉÏÃæÌáµ½µÄÖ®Í⣬»¹ÓÐÒ»¸öСµÄ²¹³ä£¬ÎÒÃÇ»ù±¾¶¼Ê¹ÓÃ#pragma
mark¸ø¿ØÖÆÆ÷µÄ´úÂë·Ö¶Î£¬Ò»¸ö±È½ÏÓвã´ÎµÄ·Ö¶Î×¢ÊÍ´ó¸ÅÊÇÕâÑùµÄ£º
#pragma mark - View Life //ÊÓͼÉúÃüÖÜÆÚ #pragma mark - Setup //´´½¨ÊÓͼµÈ #pragma mark - Lazy Load¡¢Getter¡¢Setter //ÀÁ¼ÓÔØ¡¢GetterºÍSetter #pragma mark - Event¡¢Callbacks //ʼþ¡¢»Øµ÷µÈ #pragma mark - Delegate And DataSource //´úÀíºÍÊý¾ÝÔ´·½·¨ #pragma mark - Private //˽Óз½·¨ |
ÈÏÕæ¿´ÊDz»ÊÇ·¢ÏÖÁËÆäʵºÜ¶àµÄÒµÎñÂß¼ÎÒÃǶ¼ÄÜͨ¹ýcategoryµÄ·½Ê½´ÓControllerÖзÖÀë³öÈ¥¡£ÔÚÕâÀïÎҷdz£Í¬ÒâCasa´óÉñµÄ»°£º²»Ó¦¸Ã³öÏÖ˽Óз½·¨¡£¶ÔÓÚ¿ØÖÆÆ÷À´Ëµ£¬Ë½Óз½·¨»ù±¾¶¼ÊÇÊý¾ÝÏà¹ØµÄÒµÎñ´¦Àí£¬½«ÕâЩҵÎñͨ¹ýcategory»òÕß²ßÂÔģʽ·ÖÀë³öÈ¥»áÈÿØÖÆÆ÷¸ü¼Ó¼ò½à
βÑÔ
Æäʵ²»¹ÜÊÇÈÈÃŵÄMVVM¼Ü¹¹¡¢»òÕ߯äËûÉÔÀäµÄMVCS¡¢VIPERÖ®ÀàµÄ¼Ü¹¹Ä£Ê½£¬¶¼ÊÇ»ùÓÚMVC¸Ä½øµÄ¡£±¾ÎIJ»ÊÇÒª½²MVCµÄ´úÂëÓ¦¸ÃÔõô·Ö²ã£¬Ö»ÊǰÑ×Ô¼º¶ÔÓÚÕâ¸öģʽµÄ˼¿¼¼òµ¥µÄ·ÖÏíһϣ¬Ï£ÍûÄÜÈø÷λÓÐËùÁìÎò¡£µ±È»£¬Ã»ÓÐÒ»ÖֽṹÊǾø¶ÔÍêÃÀµÄ£¬ÒµÎñÖ°ÔðµÄ»®·Ö±ØÈ»´øÀ´ÆäÏàÓ¦µÄ¸ºÃæÓ°Ï죬ÕÒµ½ÕâЩ»®·ÖµÄƽºâµã¾ÍÊÇÎÒÃÇѧϰ¼Ü¹¹Éè¼ÆµÄÒâÒåËùÔÚ |