مرجع مقالات طراحی اپلیکیشن

طراحی اپلیکیشن با جدیدترین متدهای روز دنیا

مرجع مقالات طراحی اپلیکیشن

طراحی اپلیکیشن با جدیدترین متدهای روز دنیا

واکنشگرا بودن وب اپلیکیشن ها

شاید نرم افزار هایی که برای موبایل همدم پیاده سازی می‌شوند، قابلیت و امکان نصب و فعال سازی روی هر تلفن همراه را نداشته باشند یا این که بعضی از سیستم کارداران را امان نکنند. البته این خلل در اینترنت نرم افزار ها نیست. در واقع همه اینترنت نرم افزار ها طراحی اپلیکیشن در مشهد به طور تماما ریسپانسیو و برخورد گرا پیاده سازی میشوند. این یعنی همگی این قابل انعطاف افزارها قابلیت و امکان به کار گیری روی هر نوع تلفن همراه موبایلی را دارا‌هستند و همگی یوزرها می‌توانند از آن‌ها فارغ از محدودیت استعمال نمایند. اینترنت نرم افزار ها با هر نوع شیت مرورگری سازش داشته و کارایی نیکی از خویش به اکران میگذارند.

عدم نیاز به بروزرسانی

یکی‌از دیگر از جالب ترین امتیازات و نکات مثبت اینترنت نرم افزار ها این میباشد که شما نیازی به بروزرسانی آنها ندارید. احتمالا برای شما هم اتفاق افتاده که هر تعدادی وقت یک توشه، نیاز داشته باشید نرم افزار های نصب گردیده روی تلفن همراه خویش را بروزرسانی و آپ دیت نمایید تا بتوانید از این شیوه به ورژن های نو اپلیکیشن موردنظر دسترسی داشته باشید. ولی برای دسترسی به ورژن های نو اینترنت نرم افزار نیازی بدین عمل وجود ندارد. شما بعداز اینکه از روش مرورگر خویش وارد اینترنت نرم افزار شدید میتوانید به جدیدترین نسخه و واپسین ورژن آن دسترسی داشته باشید.


عدم نیاز به نصب

همان گونه که در قسمت های گذشته اشاره کردیم، اینترنت نرم افزار ها برخلاف نرم افزار های تلفن همراه، نیازی به نصب ندارند. شما میتوانید به راحتی و در هر فرصت از روش مرورگر خویش از قابلیت و امکان های اینترنت نرم افزار به کار گیری نمایید. فکر کنید این نرم‌افزار ها نیاز به نصب داشتند. دراین‌صورت باید وقتی را برای گشتن در وب صرف می کردید تا پوشه نصبی اپ را پیدا فرمائید. بعد فرایند ای برای دانلود و در غایت نصب و راه‌اندازی اپ نیاز بود که می توانست فرصت متعددی را از شما بگیرد. البته اینک سوای نیاز به‌این فرآیند زمانبر می‌توانید با‌گاز و صرفا از روش یک سرچ معمولی در مرورگر به اینترنت نرم افزار دسترسی داشته باشید.


عدم اشغال خاطر

وقتی که شما یک نرم افزار خاص را در گوشی خویش نصب میکنید، معمولا این نرم افزار وسعت خاصی از فضای موبایل شما‌را لبریز می نماید. این نرم‌افزار ها هریک وسعت مخصوصی داشته و در شکل ارتقاء تعداد نصب شما، ممکن میباشد فضای اشغال گردیده تلفن همراه ارتقاء پیدا نماید. درپی آن سرعت کارایی دستگاه گوشی نیز یه خرده کاهش پیدا خواهد کرد.


در اینگونه قوانینی ناچارید برخی از نرم افزار هایی که لزوم کمتری دارا‌هستند را حذف یا این که غیرفعال فرمائید. البته این زمینه برای اینترنت نرم افزار ها درستی ندارد. در واقع زمانی نیازی به نصب اینترنت نرم افزار ندارید، یعنی این اپلیکیشن ها فضایی از تلفن همراه شمارا اشغال نمی‌کنند. پس شما در هر فرصت که بخواهید میتوانید به تعداد متعددی از آنان رمز زده و از تجهیزات و امکان های هریک به راحتی به کار گیری نمائید.


محصور نبودن به سیستم دلیل

پیش از اینکه کلام از فناوری اینترنت نرم افزار به در میان آید، استحصال و شغل های اینترنتی برای رابطه و تعامل بیشتر با یوزرها خویش از نرم افزار ها به کارگیری می کردند. خب همان طور که در قسمت های پیشین اشاره کردیم، پیاده سازی و راه‌اندازی نرم افزار نیازمند یاری به دست آوردن از یک دسته خبره و آشنا به هر دو ورژن اندروید و IOS میباشد. تیمی که بتواند برای هر مورد از این سیستم دست اندرکاران نرم‌افزار نویسی جدا از هم و ماهر داشته باشد تا بتوان نرم افزار را برای همه تلفن همراه های گوشی سازگار کرد.

ولی اینترنت نرم افزار ها در این زمینه، با محدودیتی روبرو نیستند. در واقع اصلی وجود ندارد که سیستم ادله تلفن همراه شما از چه ورژن ای میباشد. شما می‌توانید به یاری مرورگر خویش به لیستی از متنوع ترین و جدیدترین گونه های اینترنت نرم افزار دسترسی داشته باشید. دیدنی میباشد بدانید که توانمندی و قابلیت و امکان اینترنت نرم افزار ها به همین گزینه ختم نمیشود.


این قابل انعطاف افزارها حتی بر روی رایانه های فردی و همگی سیستم استدلال های ویندوز نیز قابل به کارگیری می‌باشند. با دقت به اینکه این روز ها بخش اعظمی از نرم افزار های سازگار با ورژن IOS مبتلا تحریم و محدودیت مصرف شده اند، شایسته ترین چاره برای سیستم ادله های IOS، به کار گیری از اینترنت نرم افزار هاست.

 

تفاوت جاوا و جاوا اسکریپت در چیست؟

به‌تیتر یک قاعده کلی برای اینکه شما تفاوت جاوا و جاوا اسکریپت را به‌خیر شعور نمائید، ما جنبه‌های متقابل هر کدام از لهجه‌ها را در کنار یکدیگر مقایسه می کنیم. این عمل به شما یاری می‌نماید که ریلکس‌خیس تفاوت در میان جاوا و جاوا اسکریپت را شعور فرمایید. طراحی اپلیکیشن در مشهد جاوا یک‌گویش قادر تایپ‌گردیده‌است و آغاز بایستی متغیرها برای به کارگیری در نرم افزار اعلام شوند. در جاوا، نوع متغیر در طول کامپایل رسیدگی می گردد. جاوا اسکریپت یک‌لهجه با تایپ ضعیف میباشد و نحو و ضوابط ریلکس‌تری داراست.

جاوا یک‌گویش نرم افزار‌نویسی شی گرا میباشد. جاوا اسکریپت یک‌گویش اپ‌نویسی مبنی بر شی میباشد.

اپ‌های جاوا میتوانند در هر ماشین مجازی (JVM) یا این که مرورگر انجام شوند. کد جاوا اسکریپت تا قبل از اینً تنها در مرورگر جاری ساختن میشد، ولی اینک میتواند از روش js روی سرور جاری ساختن خواهد شد.

شی ءها جاوا بر پایه ی کلاس می‌باشند حتی ما نمی‌توانیم هیچ نرم‌افزار‌ای در جاوا فارغ از ساخت کلاس بسازیم. شی ها جاوا اسکریپت بر اساس مثال نخستین میباشند.

اپلیکیشن جاوا دارنده پسوند پوشه “.Java” میباشد و کد منبع را به بایت کدهایی که بوسیله JVM (ماشین مجازی جاوا) جاری ساختن می گردند، ترجمه می‌نماید. پوشه جاوا اسکریپت دارنده پسوند فولدر “.js” میباشد و تعبیر و تفسیر میگردد البته کامپایل نمیشود، هر مرورگر دارنده مفسر جاوا اسکریپت برای اجرای کد JS میباشد.

جاوا یک‌لهجه غیر وابسته میباشد. جاوا اسکریپت در یک کاغذ اینترنت قرار می گیرد و با محتوای HTML آن یک پارچه میشود.

جاوا رویکردی بر طبق حرفه برای هم‌هنگامی داراست. جاوا اسکریپت یک شیوه بر طبق روی داد برای هم‌هنگامی دارااست.

جاوا از multithreading حمایت می‌نماید. جاوا اسکریپت از یک سری فن‌ای یا این که multithreading جانبداری نمی‌نماید.

گویش اپلیکیشن‌نویسی جاوا به وسیله “Sun Microsystems” پیشرفت‌یافته میباشد. گویش اپلیکیشن‌نویسی جاوا اسکریپت بوسیله “Netscape” توسعه و گسترش‌یافته میباشد.

جاوا در ماشین صاحبخانه به‌تیتر کد “Byte” ذخیره می گردد. جاوا اسکریپت در ماشین صاحبخانه (client Machine) به‌تیتر متن “منبع یا این که سورس” ذخیره می گردد.



جاوا یا این که جاوا اسکریپت کدام‌یکی‌از خوب میباشد؟

به ذکر ظریف، درباره‌ی تعیین گویش، جاوا یا این که جاوا اسکریپت، جواب صدق و دقیقی نیست، چون واضح میباشد که  این دو گویش هدف ها بسیار متفاوتی را دنبال می‌نمایند. بسته به نوح کاری که سما از لهجه میخواهید هر یک میتوانند نسبت به دیگری برتری محسوس داشته باشند و این برتری شاید صرفا در همین کاربردی که مدنظر شما میباشد وجود داشته باشد.


سود‌ گیری

با دقت به توصیفات بالا از دو لهجه اپ‌نویسی موردبحث و با اعتنا به اینکه البته  به اکثر وقت ها تفاوت‌های دربین دو گویش اشاره کردیم، هم‌اینک فهم اینکه تفاوت جاوا و جاوا اسکریپت چیست، بسیار آسوده‌خیس گردیده‌است. به‌شکل کلی می‌اقتدار اظهار‌کرد که‌این دو لهجه هیچ ارتباطی به هم ندارند و هیچ‌کدام از دیگری سرچشمه نگرفته میباشد.


به‌شکل کلی تفاوت جاوا و جاوا اسکریپت در کاربرد، نحو، طریق کامپایل و در سایر موردها به‌وضوح قابل‌مشاهده میباشد و این تفاوت‌ها را می‌قدرت به جزئیات بیشتری توسعه بخشید. امیدوارم که‌این نوشته‌ی علمی برای شما، اثر گذار واقع‌گردیده باشد.


پیاده سازی کلید Record

ما فراهم سازی عملیات صوتی را کامل شدن کرده ایم. بیایید به قسمت طراحی روال action مرتبط با کلید Record وارد شویم. پیش از این که وارد کدنویسی شویم ، اذن دهید شرحی از طریق شغل کلید “Record” ارائه دهیم. طراحی اپلیکیشن در مشهد وقتی که مخاطب روی کلید “Record” ضربه میزند ، نرم‌افزار ضبط صدا را استارت خواهد کرد ، در پی این کلید به مقدار “Pause” تغییر و تحول مییابد. در صورتی مخاطب کلید “Pause” را ضربه بزند ، برنامه در عملیات ضبط صدا تانی تولید می نماید ، تا‌زمانی‌که مجدد روی کلید “Record” ضربه زده گردد. ضبط صدا ، تنها وقتی متوقف شود که استفاده کننده روی کلید “Stop” ضربه بزند.

مشی “recordPauseTapped:” را با کد پایین بازنویسی میکنیم:

- (IBAction)recordPauseTapped:(id)sender {

// Stop the audio player before recording

if (player.playing) {

[player stop];

}


if (!recorder.recording) {

AVAudioSession *session = [AVAudioSession sharedInstance];

[session setActive:YES error:nil];


// Start recording

[recorder record];

[recordPauseButton setTitle:@\"Pause\" forState:UIControlStateNormal];


} else {


// Pause recording

[recorder pause];

[recordPauseButton setTitle:@\"Record\" forState:UIControlStateNormal];

}


[stopButton setEnabled:YES];

[playButton setEnabled:NO];

}

در کد بالا ، ما آغاز تحقیق می‌کنیم که آیا audio player در درحال حاضر پخش صدا میباشد یا این که خیر. در صورتی‌که در درحال حاضر پخش باشد ، ما به آسانی آن را با به کارگیری از سیاق “stop:” متوقف میکنیم. خط 7 از کد بالا گزینش می نماید که آیا اپلیکیشن در شرایط recording میباشد یا این که خیر. در شرایطی که در شرایط recording نباشد ، برنامه audio session ها را فعال می نماید و ضبط صدا را آغاز می نماید. برای ضبط صدا (یا این که پخش صدا) ، audio session می بایست فعال خواهد شد.


در مجموع ، ما خواهیم توانست از متدهای تحت از کلاس AVAudioRecorder  برای در اختیار گرفتن ضبط صدا به کار گیری کنیم:


record – استارت / ادامه دادن عملیات ضبط صدا

pause – ساخت و ساز وقفه در عملیات ضبط صدا

stop – متوقف کردن عملیات ضبط صدا

طراحی کلید Stop

برای کلید Stop ، ما به آسانی سیاق “stop:” را برای recorder فراخوانی میکنیم. بعد از آن با غیرفعال کردن audio session فعالیت را دنبال میکنیم. مشی “stopTapped:” را با کد پایین بازنویسی می‌کنیم:


- (IBAction)stopTapped:(id)sender {

[recorder stop];


AVAudioSession *audioSession = [AVAudioSession sharedInstance];

[audioSession setActive:NO error:nil];

}

طراحی نماینده پروتکل AVAudioRecorderDelegate

ما میتوانیم از نماینده پروتکل AVAudioRecorderDelegate برای هندل کردن وقفه های صوتی (از جملهً اخذ یک ارتباط تلفنی در زمان ضبط صدا) و کامل شدن عملیات ضبط صدا ، استعمال میکنیم. در‌این نمونه ، ViewController یک نماینده میباشد. متدهای تمجید گردیده در پروتکل AVAudioRecorderDelegate ازروی میل می‌باشند. در اینجا ، ما صرفا مشی “audioRecorderDidFinishRecording:” را برای هندل کردن ، کامل شدن عملیات ضبط صدا ، طراحی خوا‌هیم کرد. کد ذیل را در پوشه ViewController.m اضافه میکنیم:


- (void) audioRecorderDidFinishRecording:(AVAudioRecorder *)avrecorder successfully:(BOOL)flag{

[recordPauseButton setTitle:@\"Record\" forState:UIControlStateNormal];


[stopButton setEnabled:NO];

[playButton setEnabled:YES];

}

بعداز اتمام عملیات ضبط صدا ، ما به آسانی کلید “Pause” را به کلید “Record” تغییر و تحول میدهیم.


پخش صدا با به کارگیری از AVAudioPlayer

در غایت ، در‌این بخش به طراحی کلید “Play” برای پخش صدا با به کارگیری از AVAudioPlayer می رسیم. در فولدر  ViewController.m ، روال “playTapped:” را با به کار گیری از کد ذیل بازنویسی میکنیم:


- (IBAction)playTapped:(id)sender {

if (!recorder.recording){

player = [[AVAudioPlayer alloc] initWithContentsOfURL:recorder.url error:nil];

[player setDelegate:self];

[player play];

}

}

تست UI در Xcode


در Xcode 7 آزمایش UI معرفی شد‌ه‌است، که به شما اذن میدهد یک آزمایش UI را با ضبط نمودن تعاملات انجام یافته طراحی اپلیکیشن در مشهد با UI ساخت‌و‌ساز نمایید. آزمایش UI با یافت کردن اشیا UI برنامه با پرس و جوها، ادغام حادثه ها و بعد ارسال آن ها به آن شی ءها، عمل می نماید. API شما‌را توانمند می سازد تا خاصیت و حالت اشیا UI را رسیدگی نمائید تا آن‌ها‌را با شرایط موردانتظار خویش مقایسه فرمائید.
در ناوبر آزمایش پروژه BullsEye، یک UI Test Target تازه اضافه فرمائید. پژوهش نمائید که Target که بایستی آزمایش گردد، BullsEye باشد. آن‌گاه اسم پیش فرض BullsEyeUITests را بپذیرید.
این خصوصیت را به کلاس BullsEyeUITests اضافه فرمائید:
var app: XCUIApplication!
در تابع setup()، عبارت  XCUIApplication().launch() را با عبارت پایین جایگزین نمایید:
app = XCUIApplication()
app.launch()
اسم testExample() را به testGameStyleSwitch() تغییر‌و تحول دهید.
یک خط تازه در testGameStyleSwitch() ساخت و ساز کرده و روی کلید Record در پایین پنجره وایریشگر کلیک فرمایید.
وقتی که نرم افزار در مشابه ساز نمایان میشود، قسمت Slide از کلید مدل بازی و برچسب بالا را ضربه بزنید. بعد از آن دکمه ضبط Xcode را برای توقف ضبط کلیک نمایید.
فعلا شما سه خط پایین را در testGameStyleSwitch() دارید:
let app = XCUIApplication()
app.buttons[\"Slide\"].tap()
app.staticTexts[\"Get as close as you can to: \"].tap()
در صورتیکه هر عبارت دیگری باشد، آنها‌را حذف فرمائید.
خط 1 خصوصیت را که شما در setup() تولید کردید را اسکن می نماید و نیازی ندارید که شما دیگر چیزی را ضربه بزنید، از این رو خط اولیه را حذف کرده و عبارت .tap() را از انتهای خط 2و 3 را حذف فرمائید. منوی کوچکی را که در کنار [“Slide”] است، گشوده نمائید. مورد segmentedControls.buttons[\"Slide\"] را گزینش فرمائید.
براین اساس آن چه که شما دارید، این میباشد:
app.segmentedControls.buttons[\"Slide\"]
app.staticTexts[\"Get as close as you can to: \"]
این نصیب را برای ساخت و ساز یک قسمت given، تغییر تحول دهید:
// given
let slideButton = app.segmentedControls.buttons[\"Slide\"]
let typeButton = app.segmentedControls.buttons[\"Type\"]
let slideLabel = app.staticTexts[\"Get as close as you can to: \"]
let typeLabel = app.staticTexts[\"Guess where the slider is: \"]
در حال حاضر که شما اسم های دو کلید و دو برچسب قابل تعیین را دارید، آیتم تحت را اضافه نمائید:
// then
if slideButton.isSelected {
XCTAssertTrue(slideLabel.exists)
XCTAssertFalse(typeLabel.exists)

typeButton.tap()
XCTAssertTrue(typeLabel.exists)
XCTAssertFalse(slideLabel.exists)
} else if typeButton.isSelected {
XCTAssertTrue(typeLabel.exists)
XCTAssertFalse(slideLabel.exists)

slideButton.tap()
XCTAssertTrue(slideLabel.exists)
XCTAssertFalse(typeLabel.exists)
}
این نصیب رسیدگی می نماید که وقتی که هر مورد از کلیدها تعیین می‌گردد، برچسب صحیح وجود داشته باشد. آزمایش را اعمال نمایید- مجموع ادعاها می بایست توفیق آمیز باشند.
آزمایش کارایی:
برگرفته از مستندات اپل: آزمایش تلاش بلوکی از کد را که شما می‌خواهید آیتم آنالیز قرار دهید، گرفته و آن را ده توشه جاری ساختن می نماید، معدل مجال ایفا و انحراف از میزان استاندارد را گردآوری می نماید. معدل این اندازه گیری های تکی، یک ارزشی را برای اجرای آزمایش تشکیل میدهد که می‌تواند بعداً در مقایسه با یک واحد سنجش بررسی ناکامی یا این که توفیق، آیتم آنالیز قرار گیرد.
تایپ کردن آزمایش همت بسیار معمولی میباشد. کافی میباشد کدی را که میخواهید چک خواهد شد، درون سیاق measure() قرار دهید.
برای تحقیق عملی این مقاله، پروژه HalfTunes را مجدداً گشوده فرمایید، در HalfTunesFakeTests، مقدار testPerformanceExample() را با آزمایش تحت جایگزین فرمایید:
 // Performance
func test_StartDownload_Performance() {
  let track = Track(name: \"Waterloo\", artist: \"ABBA\",
      previewUrl: \"http://a821.phobos.apple.com/us/r30/Music/d7/ba/ce/mzm.vsyjlsff.aac.p.m4a\")
  measure {
    self.controllerUnderTest?.startDownload(track)
  }
}
آزمایش را انجام نمائید، آن گاه برای دیدن داده های عددی، بر روی آیکونی که در انتهای نصیب measure() نمایان میباشد، کلیک فرمایید.
روی Set Baseline کلیک فرمایید، آن‌گاه دوباره آزمایش کوشش را جاری ساختن نمایید و فیض را مشاهده فرمائید – فیض بایستی خوب یا این که بدتر از مقدار Baseline باشد. کلید Edit به شما اذن می‌دهد مقدار Baseline را برای حاصل نو، reset فرمایید.
مقادیر Baselineها بر طبق تنظیمات هر دستگاه، ذخیره میشود، بدین ترتیب شما میتوانید همین تست را روی یکسری دستگاه متفاوت ایفا دهید.
هر فرصت که شما یک برنامه را تغییر‌و تحول می دهید که ممکن میباشد بر کارایی اسلوب آزمایش گردیده، تأثیر بگذارد، آزمایش تلاش را مجدد ایفا فرمائید.
Code Coverage
ابزار Code Coverage به شما می‌گوید که کدام کدهای برنامه در آزمایش های شما آیتم ایفا قرار گرفته اند. بدین ترتیب شما میدانید که چه بخشهایی از کد برنامه شما هنوز آزمایش تشده میباشد.
برای فعال کردن code coverage، طرح Test action را دستکاری کرده و تیک code coverage را بگذارید.

به روز رسانی یک شیء

به‌دنبال ، قصد داریم نرم افزار خویش را افزایش داده و به مخاطب ، اذن آپ دیت رسانی داده ها دستگاه را بدهیم. به Storyboard رفته و یک segue نو برای سلول جدول ، اضافه می‌کنیم. این segue ، برای تولید رابطه سلول جدول و detail view controller ، به عمل طراحی اپلیکیشن در مشهد می رود. وقتی که استفاده کننده، هر دستگاهی را در table view ، گزینش نماید ، detail view controller ، داده ها دستگاه تعیین گردیده را اکران میدهد.
برای ساخت و ساز تمایز دربین این segue و segue دیگر که برای اضافه کردن یک دستگاه تازه ، به عمل می رود ، یک شناسه به اسم “UpdateDevice” ، تعریف‌و‌تمجید می‌کنیم. آن گاه ، مشی prepareForSegue ، را به پوشه DeviceViewController.m ، اضافه میکنیم.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@\"UpdateDevice\"]) {
NSManagedObject *selectedDevice = [self.devices objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];
DeviceDetailViewController *destViewController = segue.destinationViewController;
destViewController.device = selectedDevice;
}
}
زمانی که استفاده کننده ، یک دستگاه خاص را در table view ، گزینش می نماید ، اطلاعات از روش segue ، “UpdateDevice”  ، جابجایی داده گردد. آن‌گاه ، داده ها دستگاه تعیین گردیده را بازیابی کرده و آن را به detail view controller ، جابجایی میدهیم.

در‌پی ، یک خصیصه تازه ، برای ذخیره سازی داده ها دستگاه گزینش گردیده ، در فولدر DeviceDetailViewController.h ، اضافه می‌کنیم:

@property (strong) NSManagedObject *device;
طبق مشی ، فرمان synthesis را به پوشه DeviceDetailViewController.m ، اضافه می‌کنیم.

@implementation DeviceDetailViewController
@synthesize device;
برای اکران داده ها دستگاه تعیین گردیده ، می بایست تغییرات پایین را در روال “viewDidLoad”  ، انجام کنیم:

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
if (self.device) {
[self.nameTextField setText:[self.device valueForKey:@\"name\"]];
[self.versionTextField setText:[self.device valueForKey:@\"version\"]];
[self.companyTextField setText:[self.device valueForKey:@\"company\"]];
}

}
بیایید عمل را اینجا ، متوقف کرده و تلاش کنیم مجدد برنامه را انجام کنیم. بعداز فعال‌ساز‌ی نرم افزار ، روی یکی دستگاه ها ضربه میزنیم ، داده ها دستگاه ، می بایست در برگه detail view ، نمایان گردد.



با این حالا ، هنوز فعالیت نرم افزار ، مجموع نشده میباشد. در صورتی کوشش کنیم که داده ها یک دستگاه را بازنویسی نماییم ، داده ها دستگاه ، به صحت ، آپدیت رسانی نخواهد شد. به فولدر DeviceDetailViewController.m  ، بازگشته و اسلوب “save” را تغییر تحول می‌دهیم:

- (IBAction)save:(id)sender {
NSManagedObjectContext *context = [self managedObjectContext];

if (self.device) {
// Update existing device
[self.device setValue:self.nameTextField.text forKey:@\"name\"];
[self.device setValue:self.versionTextField.text forKey:@\"version\"];
[self.device setValue:self.companyTextField.text forKey:@\"company\"];

} else {
// Create a new device
NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@\"Device\" inManagedObjectContext:context];
[newDevice setValue:self.nameTextField.text forKey:@\"name\"];
[newDevice setValue:self.versionTextField.text forKey:@\"version\"];
[newDevice setValue:self.companyTextField.text forKey:@\"company\"];
}

NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
NSLog(@\"Can\'t Save! %@ %@\", error, [error localizedDescription]);
}

[self dismissViewControllerAnimated:YES completion:nil];
}