Arabic (العربية/عربي) translation by Yanti Baddolo (you can also view the original English article)

تعد AV Foundation إطار عمل للعمل مع الوسائط الصوتية والمرئية على نظامي iOS و OSX. استخدام مركبات مؤسسة، يمكنك اللعب، التقاط، وترميز وسائل الإعلام. وإطار واسع جداً وغرض هذا البرنامج التعليمي سوف نركز على جزء الصوت. على وجه التحديد ، AVAudioPlayer فئة AVAudioPlayer
لتشغيل ملفات MP3.
مشروع كاتب
ولقد قدمت مشروع كاتب يحتوي على كافة الإجراءات والمنافذ التي تم تكوينها مسبقاً، ومع الأساليب المناسبة اللفائف. ويستخدم المشروع الفئات، هي الفعل اللفائف كذلك حيث أننا يمكن الغوص الحق في التعليمات البرمجية. يمكنك تنزيل مشروع البدء من GitHub .
1. ربط الإطار مؤسسة AV
قبل أن يمكنك استخدام مركبات مؤسسة، يجب عليك ربط المشروع ضد الإطار. في Project Navigator ، تأكد من تحديد المشروع الخاص بك. ضمن علامة التبويب عام ، انتقل إلى الأطر والمكتبات المرتبطة ، ومن هناك اختر AVFoundation.framework .

2. فئة FileReader
في مشروع البدء ، ستجد ملفًا باسم FileReader.swift . افتح هذا الملف لعرض محتوياته. فتح هذا الملف لعرض محتوياته.
import UIKit class FileReader: NSObject { }
هذا هو كعب روتين بسيط للفئة التي سوف نستخدمها لقراءة الملفات من القرص. يرث من NSObject . readFiles
طريقة ، readFiles
، والتي ستكون طريقة كتابة نوع أساليب تسمح لك باستدعاء أسلوب في الفئة نفسها، النوع، بدلاً من مثيل للفئة. يوجد أدناه تطبيق الأسلوب readFiles .
class func readFiles() -> [String] { return NSBundle.mainBundle().pathsForResourcesOfType("mp3", inDirectory: nil) as! [String] }
الحزمة الرئيسية يحتوي على التعليمات البرمجية والموارد المخصصة للمشروع الخاص بك، ومن هنا أن نجد ملفات mp3. نستخدم مسار الأسلوبpathsForResourcesOfType(_:inDirectory:) method
، الذي يقوم بإرجاع صفيف يحتوي على أسماء المسار لنوع المورد المحدد. في هذه الحالة ، نحن نبحث عن النوع "mp3"
. نظرًا لأننا غير مهتمين بدليل محدد ، فإننا نمرر nil .
سيتم استخدام هذه الفئة من قبل فئة MP3Player
، والتي سنعمل عليها في المرة القادمة.
3. فئة MP3Player
بعد ذلك ، افتح MP3Player.swift وعرض محتوياته.
import UIKit import AVFoundation class MP3Player: NSObject, AVAudioPlayerDelegate { }
لاحظ أننا AVAudioPlayerDelegate بروتوكول AVAudioPlayerDelegate
. يعلن هذا البروتوكول عن عدد من الطرق المفيدة ، واحدة منها هي audioPlayerDidFinishPlaying(_:successfully:)
. من خلال تطبيق audioPlayerDidFinishPlaying(_:successfully:)
، سيتم إعلامنا عند انتهاء تشغيل الصوت.
الخطوة 1: الخصائص
أضف ما يلي إلى MP3Player.swift .
class MP3Player: NSObject, AVAudioPlayerDelegate { var player:AVAudioPlayer? var currentTrackIndex = 0 var tracks:[String] = [String]() }
ستكون خاصية player
عبارة عن مثيل لفئة AVAudioPlayer ، والتي AVAudioPlayer
لتشغيل ملفات MP3 وإيقافها مؤقتًا وإيقافها. يحتفظ المتغير currentTrackIndex MP3
التي يتم تشغيلها حاليًا. وأخيرًا ، سيكون متغير tracks
صفيفًا للمسارات إلى قائمة ملفات MP3 المضمنة في حزمة التطبيق.
الخطوة 2: init
override init(){ tracks = FileReader.readFiles() super.init() queueTrack(); }
أثناء التهيئة ، readFiles
أسلوب readFiles FileReader
لجلب مسارات ملفات MP3 وتخزين هذه القائمة في صفيف tracks
. لأن هذا هو مُهيئ المعين ، يجب علينا استدعاء الأسلوب init
العليا. وأخيرًا ، نسمي queueTrack ، الذي queueTrack
بعد ذلك.
الخطوة 3: queueTrack
أضف التنفيذ التالي لأسلوب queueTrack
إلى فئة queueTrack
.
func queueTrack(){ if (player != nil) { player = nil } var error:NSError? let url = NSURL.fileURLWithPath(tracks[currentTrackIndex] as String) player = AVAudioPlayer(contentsOfURL: url, error: &error) if let hasError = error { //SHOW ALERT OR SOMETHING } else { player?.delegate = self player?.prepareToPlay() } }
نظرًا لأننا سنقوم بإنشاء مثيل جديد لـ AVAudioPlayer
كل مرة يتم فيها استدعاء هذه الطريقة ، فإننا نقومAVAudioPlayer
التدبير المنزلي عن طريق تعيين player إلى nil
.
نعلن NSErro
r اختياري NSError url
ثابت. fileURLWithPath(_:)
لجلب المسار إلى MP3 الحالي وتخزين القيمة في url
. نحن currentTrackIndex صفيف tracks
كمعلمة باستخدامcurrentTrackIndex
. تذكر المسارات الصفيف يحتوي على المسارات إلى ملفات mp3 وليس مرجع لملفات MP3 أنفسهم.
AVAudioPlayer player
، فإننا نمرر متغير url
ومتغير error
إلى AVAudioPlayer
. في حالة فشل التهيئة ، يتم ملء متغير error
مع وصف الخطأ.
إذا لم نواجه خطأ ، فإننا prepareToPlay
مفوض اللاعب على self
prepareToPlay طريقةprepareToPlay على المشغل. prepareToPlay طريقة prepareToPlay
على تحميل المخازن المؤقتة والحصول على جهاز الصوت ، مما يقلل من أي تباطؤ عند استدعاء طريقة play
.
الخطوة 4: play
تتحقق طريقة play
أولاً لمعرفة ما إذا كان الصوت مشغلاً بالفعل أم لا عن طريق التحقق من خاصية التشغيل المسماة بشكل صحيح. إذا لم يتم تشغيل الصوت ، فإنه يستدعي طريقة play
الخاصة بخاصية player
.
func play() { if player?.playing == false { player?.play() }
الخطوة 5: stop
تتحقق طريقة stop
أولاً من تشغيل مشغل الصوت بالفعل. إذا كان الأمر كذلك ، فإنه يستدعي أسلوب stop
ويقوم بتعيين الخاصية currentTime
إلى 0 . عندما تستدعي أسلوب stop
، يتوقف الأمر فقط عن الصوت. فإنه لا إعادة تعيين الصوت إلى البداية، هذا السبب في أننا بحاجة إلى القيام بذلك يدوياً.
func stop(){ if player?.playing == true { player?.stop() player?.currentTime = 0 } }
الخطوة 6: pause
تمامًا مثل طريقة stop
، نتحقق أولاً لمعرفة ما إذا كان مشغل الصوت مشغلاً أم لا. إذا كان الأمر كذلك ، فإننا نستدعي أسلوب pause
.
func pause(){ if player?.playing == true{ player?.pause() } }
الخطوة 7: nextSong
nextSong(_:Bool)
للأغنية التالية ، وفي حالة تشغيل المشغل ، يتم تشغيل هذه الأغنية. نحن لا نريد الأغنية التالية اللعب إذا كان اللاعب متوقفة مؤقتاً. ومع ذلك، يتم استدعاء هذا الأسلوب عند انتهاء أغنية اللعب. في هذه الحالة ، نرغب في تشغيل الأغنية التالية ، وهو ما تعنيه المعلمة songFinishedPlaying
.
func nextSong(songFinishedPlaying:Bool){ var playerWasPlaying = false if player?.playing == true { player?.stop() playerWasPlaying = true } currentTrackIndex++ if currentTrackIndex >= tracks.count { currentTrackIndex = 0 } queueTrack() if playerWasPlaying || songFinishedPlaying { player?.play() } }
يتم استخدام المتغير playerWasPlaying
لمعرفة ما إذا كان المشغل يلعب أم لا عندما يتم استدعاء هذه الطريقة. إذا كان يتم تشغيل الأغنية ، فإننا playerWasPlaying
أسلوب stop
على player
وضبطplayerWasPlaying إلى true
بعد ذلك ، نقوم بزيادة " currentTrackIndex
وتحقق لمعرفة ما إذا كان أكبر من أو يساويtracks.count
. تمنحك خاصية count
صفيف العدد الإجمالي للعناصر في الصفيف. نحتاج إلى التأكد من أننا لا نحاول الوصول إلى عنصر غير موجود في مجموعة tracks
. لمنع هذا ، قمنا بتعيينcurrentTrackIndex
مرة أخرى إلى العنصر الأول من المصفوفة إذا كانت هذه هي الحالة.
وأخيرًا ، queueTrack
للحصول على الأغنية التالية جاهزة ولعب تلك الأغنية إذا كان أيًا منplayerWasPlaying
أو songFinishedPlaying
true
.
الخطوة 8: previousSong
طريقة nextSong
تشبه الى حد بعيد nextSong
. والفرق الوحيد هو أننا نقوم currentTrackIndexمؤشر currentTrackIndex
والتحقق مما إذا كان يساوي 0 .
func previousSong(){ var playerWasPlaying = false if player?.playing == true { player?.stop() playerWasPlaying = true } currentTrackIndex-- if currentTrackIndex < 0 { currentTrackIndex = tracks.count - 1 } queueTrack() if playerWasPlaying { player?.play() } }
من خلال الاستفادة من كل من nextSong
و previousSong
، فنحن قادرون على التنقل عبر كل ملفات MP3 ونبدأ من جديد عندما نصل إلى بداية القائمة أو نهايتها.
الخطوة 9: getCurrentTrackName
يحصل أسلوب getCurrentTrackName
على اسم MP3 بدون الامتداد.
func getCurrentTrackName() -> String { let trackName = tracks[currentTrackIndex].lastPathComponent.stringByDeletingPathExtension return trackName }
نحصل على إشارة إلى ما هو MP3 الحالي باستخدام tracks[currentTrackIndex]
. تذكر ، مع ذلك ، أن هذه هي المسارات إلى ملفات MP3 وليس الملفات الفعلية نفسها. المسارات طويلة بدلاً من ذلك ، لأنها المسار الكامل لملفات MP3. المسارات طويلة نوعا ما، لأن ذلك هو المسار الكامل إلى ملفات MP3.
على الجهاز الخاص بي ، على سبيل المثال ، العنصر الأول من صفيف tracks
يساوي " / Users / jamestyner / Library / Developer / CoreSimulator / Devices / 80C8CD34-22AE-4F00-862E-FD41E2D8D6BA / data / Containers / Bundle / Application / 3BCF8543 -BA1B-4997-9777-7EC56B1C4348 / MP3Player.app / Lonesome Road Blues.mp3 ". سيكون هذا المسار مختلفًا على جهاز فعلي بالطبع. سيكون هذا المسار مختلفة على جهاز الفعلية بالطبع.
لقد حصلنا على سلسلة كبيرة تحتوي على المسار إلى MP3، ولكن نريد فقط اسم MP3 نفسها. تحدد فئة NSString
خاصيتين يمكن أن تساعدنا. كما يشير الاسم ، ترجع الخاصية lastPathComponent
المكون الأخير من مسار. كما قد خمنت ، يزيل الخاصية stringByDeletingPathExtension
الملحق.
الخطوة 10: getCurrentTimeAsString
يستخدم أسلوب currentTime خاصية currentTime
الخاصة بمثيل player
currentTime
كسلسلة يمكن قراءتها بواسطة الإنسان (على سبيل المثال ، 1:02) .
func getCurrentTimeAsString() -> String { var seconds = 0 var minutes = 0 if let time = player?.currentTime { seconds = Int(time) % 60 minutes = (Int(time) / 60) % 60 } return String(format: "%0.2d:%0.2d",minutes,seconds) }
الخاصية currentTime
من النوع NSTimeInterval
، وهو مجرد typealias
لـ Double
. نحن نستخدم بعض الرياضيات للحصول على seconds
minutes
، مع التأكد من تحويل time
إلى Int
حيث أننا نحتاج إلى العمل بأرقام كاملة. إذا لم تكن مألوفة مع المشغل الباقي (%)، يجدها المتبقية بعد تقسيم رقم واحد بآخر. إذا كان متغير time
يساوي 65 ، فإن seconds
تساوي 5 لأننا نستخدم 60 .
الخطوة 11: getProgress
يتم استخدام الأسلوب getProgress
بواسطة مثيل UIProgressView
لإعطاء إشارة إلى مقدار تشغيل MP3. MP3. يتم تمثيل هذا التقدم بقيمة من 0.0 إلى 1.0 كـ Float
.
func getProgress()->Float{ var theCurrentTime = 0.0 var theCurrentDuration = 0.0 if let currentTime = player?.currentTime, duration = player?.duration { theCurrentTime = currentTime theCurrentDuration = duration } return Float(theCurrentTime / theCurrentDuration) }
للحصول على هذه القيمة ، نقوم بتقسيم خاصية currentTime
player
خاصية duration
، نقوم بتخزين هذه القيم في المتغيرات theCurrentTime
و theCurrentDuration
. مثل currentTime
، تكون خاصية duration
من النوع NSTimeInterval
وتمثل مدة الأغنية بالثواني.
الخطوة 12: setVolume
setVolume(_:Float)
طريقة setVolume
لمثيل player
.
func setVolume(volume:Float){ player?.volume = volume }
الخطوة 13: audioPlayerDidFinishPlaying(_:successfully:)
تعد audioPlayerDidFinishPlaying(_:successfully:)
طريقة طريقة بروتوكولAVAudioPlayerDelegate
. تأخذ هذه الطريقة كمعلمات لمثيل AVAudioPlayer
و boolean. يتم تعيين القيمة المنطقية إلى true
إذا انتهى مشغل الصوت من تشغيل الأغنية الحالية.
func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool){ if flag == true { nextSong(true) } }
إذا انتهيت الأغنية من اللعب بنجاح ، فإننا نطلق على طريقة nextSong ، nextSong
true
منذ انتهاء الأغنية من تلقاء نفسها.
هذا يكمل فئة MP3Player
. سنقوم بإعادة النظر فيها بعد قليل ، بعد تنفيذ إجراءات فئة ViewController
.
4. فئة ViewController
افتح ViewController.swift وعرض محتوياته.
mport UIKit import AVFoundation class ViewController: UIViewController { var mp3Player:MP3Player? var timer:NSTimer? @IBOutlet weak var trackName: UILabel! @IBOutlet weak var trackTime: UILabel! @IBOutlet weak var progressBar: UIProgressView! override func viewDidLoad() { super.viewDidLoad() } @IBAction func playSong(sender: AnyObject) { } @IBAction func stopSong(sender: AnyObject) { } @IBAction func pauseSong(sender: AnyObject) { } @IBAction func playNextSong(sender: AnyObject) { } @IBAction func setVolume(sender: UISlider) { } @IBAction func playPreviousSong(sender: AnyObject) { } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
متغير mp3Player
هو مثال لفئة MP3Player
قمنا بتنفيذها سابقًا. سيتم استخدام متغير timer
لتحديثtrackTime
progressBar
كل مرة.
في الخطوات القليلة التالية ، ViewController إجراءات فئة ViewController
. ولكن أولاً ، يجب علينا إنشاء مثيل MP3Player
. قم بتحديث تنفيذ طريقة viewDidLoad
كما هو موضح أدناه.
override func viewDidLoad() { super.viewDidLoad() mp3Player = MP3Player() }
الخطوة 1: playSong(_: AnyObject)
أدخل ما يلي في طريقة playSong(_: AnyObject)
.
@IBAction func playSong(sender: AnyObject) { mp3Player?.play() }
في هذه الطريقة ، mp3Player
طريقة play
على كائن mp3Player . نحن في نقطة حيث يمكننا أن نبدأ اختبار التطبيق الآن. قم بتشغيل التطبيق واضغط على زر التشغيل. وينبغي بدء الأغنية اللعب.
الخطوة 2: stopSong(_: AnyObject)
استدعاء أسلوب stopSong(_: AnyObject)
أسلوب التوقف على كائن mp3Player
.
@IBAction func stopSong(sender: AnyObject) { mp3Player?.stop() }
تشغيل التطبيق مرة أخرى واضغط على زر التشغيل. الآن يجب أن تكون قادراً على وقف الأغنية بالنقر فوق الزر إيقاف.
الخطوة 3: pauseSong(_: AnyObject)
كما قد خمنت ، تستدعي طريقة pauseSong(_: AnyObject
) طريقة pause
على كائن mp3Player
.
@IBAction func pauseSong(sender: AnyObject) { mp3Player?.pause() }
الخطوة 4: playNextSong(_: AnyObject)
IBAction func playNextSong(sender: AnyObject) { mp3Player?.nextSong(false) }
في playNextSong(_: AnyObject) ، nextSong
أسلوب nextSong
على كائن mp3player
. ملاحظة أننا تمرير false
كمعلمة، لأن الأغنية لم تنتهي اللعب الخاصة به. ونحن نبدأ الأغنية التالية يدوياً بالضغط على زر التالي.
الخطوة 5: previousSong(_: AnyObject)
@IBAction func playPreviousSong(sender: AnyObject) { mp3Player?.previousSong() }
كما ترون، التنفيذ previousSong(_: AnyObjec
t) الأسلوب مشابهة جداً لتلك التي nextSong(_: AnyObject)
. ينبغي أن تكون كافة الأزرار الخاصة بمشغل MP3 الفنية الآن. إذا كنت لا اختبار التطبيق بعد، الآن سيكون وقتاً طيبا للتأكد من أن كل شيء يعمل كما هو متوقع.
الخطوة 6: setVolume(_: UISlider)
setVolume(_: UISlider)
أسلوب استدعاء الأسلوب setVolume
على كائن mp3Player
. الخاصية وحدة التخزين من نوع Float
. تتراوح القيمة من 0.0 إلى 1.0 . تم UISlider كائنUISlider
بـ 0.0 كقيمة دنيا و 1.0 كقيمة قصوى لها.
@IBAction func setVolume(sender: UISlider) { mp3Player?.setVolume(sender.value) }
تشغيل التطبيق مرة أخرى واللعب مع مربع تمرير حجم الصوت اختبار أن كل شيء يعمل بشكل صحيح.
الخطوة السابعة: startTimer
أسلوب NSTimer instantiates
مثيل NSTimer
جديد.
func startTimer(){ timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("updateViewsWithTimer:"), userInfo: nil, repeats: true) }
scheduledTimerWithTimeInterval(_:target:selector:userInfo:repeats:)
كمعلمات عدد الثواني بين إطلاق الموقت ، الكائن الذي تريد استدعاء أسلوب على المحدد بواسطة selector
، الطريقة التي يتم استدعائها عند تشغيل المؤقت ، وهو قاموس userInfo
اختياري ، وما إذا كان جهاز ضبط الوقت يكرر حتى يتم إبطاله.
نحن نستخدم طريقة باسم updateViewsWithTimer(_: NSTimer) كمحدد ، لذلكupdateViewsWithTimer(_: NSTimer)
ذلك التالي.
الخطوة 8: updateViewsWithTimer(_: NSTimer)
updateViewsWithTimer(_: NSTimer) updateViewsWithTimer(_: NSTimer)
طريقة updateViews ، والتي updateViews
في الخطوة التالية.
func updateViewsWithTimer(theTimer: NSTimer){ updateViews() }
الخطوة التاسعة: updateViews
تقوم طريقة updateViews
بتحديث trackTime
و progressBar views
.
func updateViews(){ trackTime.text = mp3Player?.getCurrentTimeAsString() if let progress = mp3Player?.getProgress() { progressBar.progress = progress } }
يتم تحديث خاصية text
من trackTime
مع الخاصية currentTime
، المنسقة كسلسلة عن طريق استدعاء الأسلوب getCurrentTimeAsString
نعلن عن progress
مستمر باستخدام طريقةgetProgress
، وتعيين progressBar.progress
باستخدام هذا الثابت.
الخطوة 10: الأسلاك يصل جهاز ضبط الوقت
الآن نحن بحاجة إلى استدعاء طريقة startTimer
في الأماكن المناسبة. نحتاج إلى تشغيل جهاز ضبط الوقت في طريقة playSong(_: AnyObject)
، أسلوب playNextSong(_ :AnyObject)
، والأسلوبplayPreviousSong(_ :AnyObject)
.
@IBAction func playSong(sender: AnyObject) { mp3Player?.play() startTimer() }
@IBAction func playNextSong(sender: AnyObject) { mp3Player?.nextSong(false) startTimer() }
@IBAction func playPreviousSong(sender: AnyObject) { mp3Player?.previousSong() startTimer() }
الخطوة 11: إيقاف جهاز ضبط الوقت
نحتاج أيضًا إلى إيقاف timer
عندما يتم الضغط على أزرار الإيقاف والتوقف. يمكنك إيقاف كائن timerضبط timer
عن طريق استدعاء أسلوب invalidate
على مثيل NSTimer
.
@IBAction func stopSong(sender: AnyObject) { mp3Player?.stop() updateViews() timer?.invalidate() }
@IBAction func pauseSong(sender: AnyObject) { mp3Player?.pause() timer?.invalidate() }
الخطوة 12: setTrackName
setTrackName
الأسلوب setTrackName
الخاصية text
لـ trackNamegetCurrentTrackName
على كائن mp3Player
.
func setTrackName(){ trackName.text = mp3Player?.getCurrentTrackName() }
الخطوة 13: setupNotificationCente
r
عند انتهاء أغنية اللعب، ينبغي أن تظهر اسم الأغنية التالية تلقائياً وبدء تشغيل الأغنية. أيضاً ، عندما يقوم المستخدم بالضغط على الزر "تشغيل" أو التالي أو الأزرار السابقة ، يجب استدعاء أسلوب setTrackName
. المكان المثالي للقيام بذلك هو طريقة queueTrack
.
نحتاج إلى طريقة ViewController فئة ViewController
بفئة ViewController
لاستدعاء طريقة setTrackNam
e . للقيام بذلك ، سوف نستخدم فئة NSNotificationCenter
. مركز إعلام يوفر طريقة بث المعلومات في جميع أنحاء برنامج. بالتسجيل كمراقب مع مركز إعلام، كائن يمكن أن تلقي هذه البرامج الإذاعية والقيام بعملية. كائن تلقي هذه البث وتنفيذ عملية. والطريقة الأخرى لإنجاز هذه المهمة هي استخدام نمط التفويض .
أضف الأسلوب التالي إلى فئة ViewController
.
func setupNotificationCenter(){ NSNotificationCenter.defaultCenter().addObserver(self, selector:"setTrackName", name:"SetTrackNameText", object:nil) }
نحن أولاً الحصول على مرجع إلى مركز الإعلام الافتراضي. ثمaddObserver(_:selector:name:object:) أسلوبaddObserver(_:selector:name:object:)
في مركز الإعلام. هذا الأسلوب يقبل المعلمات الأربعة:
- الكائن تسجيل كمراقب ،
self
في هذه الحالة - الرسالة التي سيتم إرسالها إلى المراقب عندما يتم نشر الإشعار
- اسم الإخطار التي يتم تسجيل المراقب
- الكائن الإخطارات التي يريد المراقب لتلقي
بالمرور nil
كوسيطة أخيرة ، فإننا نستمع إلى كل إشعار يحتوي على اسم SetTrackNameText .
الآن نحن بحاجة إلى استدعاء هذا الأسلوب في طريقة viewDidLoad التحكم في viewDidLoad
.
override func viewDidLoad() { super.viewDidLoad() mp3Player = MP3Player() setupNotificationCenter() }
الخطوة 14: نشر الإشعار
لنشر الإشعار ، نطلب postNotificationName(_:object:)
في مركز الإشعارات الافتراضي. كما ذكرت سابقًا ، سنفعل ذلك في طريقة queueTrack
. افتح MP3Player.swift وقم بتحديث طريقةqueueTrack
كما هو موضح أدناه.
func queueTrack(){ if(player != nil){ player = nil } var error:NSError? let url = NSURL.fileURLWithPath(tracks[currentTrackIndex] as String) player = AVAudioPlayer(contentsOfURL: url, error: &error) if let hasError = error { //SHOW ALERT OR SOMETHING } else { player?.delegate = self player?.prepareToPlay() NSNotificationCenter.defaultCenter().postNotificationName("SetTrackNameText", object: nil) } }
إذا قمت باختبار التطبيق الآن واسمحوا أغنية على طول الطريق من خلال اللعب، فإنه ينبغي بدء تشغيل الأغنية التالية تلقائياً. ولكن يمكن أن يتساءل لماذا اسم الأغنية لا تظهر أثناء الأغنية الأولى. تستدعي طريقة init
لفئة queueTrack
طريقة queueTrack
، ولكن نظرًا لعدم انتهائها من التهيئة ، فإنها لا تؤثر.
كل ما نحتاج إليه هو استدعاء طريقة setTrackName
يدويًا بعد تهيئة كائن mp3Player
. قم بإضافة التعليمة البرمجية التالية إلى طريقة viewDidLoad
في ViewController.swift .
override func viewDidLoad() { super.viewDidLoad() mp3Player = MP3Player() setupNotificationCenter() setTrackName() updateViews() }
ستلاحظ أنني اتصلت أيضًا بطريقة updateViews
. بهذه الطريقة ، يعرض اللاعب وقتًا 0:00 في البداية. إذا قمت باختبار التطبيق الآن، يجب أن يكون مشغل MP3 تعمل بكامل طاقتها.
الاستنتاج
وكان هذا البرنامج تعليمي طويلة نوعا، ولكن الآن لديك مشغل MP3 فنية على بناء وتوسيع. اقتراح واحد هو السماح للمستخدم باختيار أغنية للعب من خلال تطبيق UITableView
أسفل المشغل. شكرا للقراءة، وآمل أن كنت قد تعلمت شيئا مفيداً.
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post