Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
MVC¼Ü¹¹ÔÓ̸
 
 À´Ô´£º²©¿Í  ·¢²¼ÓÚ£º 2016-9-8
  1886  次浏览      35
 

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µÄ´úÂëÓ¦¸ÃÔõô·Ö²ã£¬Ö»ÊǰÑ×Ô¼º¶ÔÓÚÕâ¸öģʽµÄ˼¿¼¼òµ¥µÄ·ÖÏíһϣ¬Ï£ÍûÄÜÈø÷λÓÐËùÁìÎò¡£µ±È»£¬Ã»ÓÐÒ»ÖֽṹÊǾø¶ÔÍêÃÀµÄ£¬ÒµÎñÖ°ÔðµÄ»®·Ö±ØÈ»´øÀ´ÆäÏàÓ¦µÄ¸ºÃæÓ°Ï죬ÕÒµ½ÕâЩ»®·ÖµÄƽºâµã¾ÍÊÇÎÒÃÇѧϰ¼Ü¹¹Éè¼ÆµÄÒâÒåËùÔÚ

   
1886 ´Îä¯ÀÀ       35
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù

×îл¼Æ»®
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 12-11[±±¾©]
LLM´óÄ£ÐÍÓëÖÇÄÜÌ忪·¢ÊµÕ½ 12-18[±±¾©]
ǶÈëʽÈí¼þ²âÊÔ 12-25[±±¾©]
AIÔ­ÉúÓ¦ÓõÄ΢·þÎñ¼Ü¹¹ 1-9[±±¾©]
AI´óÄ£Ðͱàд¸ßÖÊÁ¿´úÂë 1-14[±±¾©]
ÐèÇó·ÖÎöÓë¹ÜÀí 1-22[±±¾©]

Ïà¹ØÎÄÕÂ


ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þ
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS

Ïà¹ØÅàѵ¿Î³Ì


ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
SOAÌåϵ½á¹¹Êµ¼ù

³É¹¦°¸Àý


Èñ°²¿Æ¼¼ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨
³É¶¼ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£Æû³µ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
±±¾© Èí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£ Èí¼þ¼Ü¹¹Éè¼Æ°¸ÀýÓëʵ¼ù
±±¾© ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ÉîÛÚ ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù